foretop

Open source · Apache-2.0 · runs locally and in CI

191 shutdown dates.
Which ones are in your code?

Model retirements have calendar dates, and the dates do not move. Ebb reads your repository against a public registry of 191 dated retirements across 5 providers and tells you which ones you are carrying — with the file, the line, and the day it stops working.

Read the registry

Source stays local Every result links to evidence Unknown is never reported as clear

langchain-ai/langchain @ e92c8a0 · real outputEbb · by deadline
2023-03-231273d overdue code-davinci-001 → gpt-4o base.py:733
2023-03-231273d overdue code-cushman-002 → gpt-4o base.py:734
2026-09-2812 days gpt-3.5-turbo-instruct → gpt-5.6-terra azure.py:34
179 references carry a published deadline · 2,552 source files · scanned 2026-09-16 512 more have no verified entry — reported unknown, never clear
A date is one kind of change from outside. Three more checks: telltale API telemetry charter agent capability lading AI asset licences

Real repositories. Reproducible results.

The output above is not a mock-up. Ebb was run against langchain-ai/langchain pinned at commit e92c8a0, and every result below links to the exact source line at that exact revision. Re-run the same command and you get the same answers.

179Model references with published deadlines
155In library or runtime source
24In tests or examples
e92c8a0Pinned commit · scanned 2026-09-16

Those 179 are the references carrying a real published deadline. The scan returned 1,542 results in total across all five checks — the large majority unknown, meaning no verified registry entry exists for them. Unknown is reported as unknown, never as clear, and it is not counted here as though it were a problem we had found.

Every finding is the same shape

Expected, observed, and the evidence that proves the difference. One format across every check, so a deadline and a missing alert read the same way. These rows are real — they come from pointing all five checks at public repositories and publishing everything that came back.

langchain-ai/langchain @ e92c8a0 see the full report →
LangChain: sample results, one row per check
CheckSubjectExpectedObserved EvidenceStateDue
ebb gpt-4 supported retires 2026-10-23 · invocation reference, use gpt-5.6-sol eval_chain.py:169:43 ≠drift 37 days
charter docs-langchain declared tools enumerated http server, not enumerated .mcp.json:3 ?unknown —
lading aiohappyeyeballs licence resolved PSF-2.0 — attribution uv.lock ✓clear —
telltale openapi.yaml a contract to check no spec at repo root — ?unknown —
langfuse/langfuse @ 431d5ba see the full report →
Langfuse: sample results, one row per check
CheckSubjectExpectedObserved EvidenceStateDue
telltale GET /api/public/annotation-queues log signal present no telemetry config in repo openapi.yml:29 ≠drift —
telltale POST /api/public/annotation-queues log signal present no telemetry config in repo openapi.yml:83 ≠drift —
telltale GET /api/public/annotation-queues/{queueId} log signal present no telemetry config in repo openapi.yml:129 ≠drift —
ebb gemini-pro supported retired 2025-02-18 · configuration reference ci-runtime-analyst.lock.yml:872:1975 ✕break 575d overdue
ebb gpt-5-2025-08-07 supported retires 2026-12-11 · invocation reference, use gpt-5.6-sol types.ts:344:3 ≠drift 86 days
undertow Amazon Web Services (AWS) known subprocessor set 8 listed, effective 2026-08-10 subprocessors page ✓clear —
Significant-Gravitas/AutoGPT @ 98381ab see the full report →
AutoGPT: sample results, one row per check
CheckSubjectExpectedObserved EvidenceStateDue
lading aio-pika licence resolved Apache-2.0 — attribution, redistribution poetry.lock ✓clear —
telltale GET /api/admin/blocks/cost-estimates log signal present no telemetry config in repo openapi.yml:11 ≠drift —
telltale GET /api/admin/bot-analytics/command-usage log signal present no telemetry config in repo openapi.yml:86 ≠drift —
ebb claude-sonnet-4-20250514 supported retired 2026-06-15 · configuration reference, use claude-sonnet-4-6 agent_00fdd42c-a14c-4d19-a567-65374ea0e87f.json:2126:22 ✕break 93d overdue
ebb whisper-1 supported retires 2027-02-26 · configuration reference brain_dump_eval.py:67:6 ≠drift 163 days
nuxt/nuxt.com @ 63f1985 see the full report →
nuxt.com: sample results, one row per check
CheckSubjectExpectedObserved EvidenceStateDue
charter nuxt declared tools enumerated http server, not enumerated .mcp.json:3 ✓clear —
ebb claude-sonnet-4.6 supported actively supported, no retirement date announced agent.ts:6:25 ✓clear —
ebb claude-fable-5.1 supported not in the retirement registry agent-results.json:16:17 ?unknown —
chanzuckerberg/single-cell-data-portal @ f41b2a4 see the full report →
the CZI data portal: sample results, one row per check
CheckSubjectExpectedObserved EvidenceStateDue
charter postgresql declared tools enumerated http server, not enumerated .mcp.json:3 ?unknown —
lading Authlib licence resolved BSD-3-Clause — attribution requirements.txt ✓clear —
ebb gpt-4 supported retires 2026-10-23 · configuration reference, use gpt-5.6-sol openai_provider.py:12:35 ≠drift 37 days
ebb gpt-3.5-turbo supported retires 2026-10-23 · configuration reference, use gpt-5.6-terra openai_provider.py:12:64 ≠drift 37 days

unknown is a real state, not an absence of one. When a check cannot see something, it says so — it never reports clear. Each report above links to every result from that scan, including the checks that found nothing and said why.

How it works

Three steps, in order, because each depends on the last.

First

Scan locally

Source, configuration, Terraform, Dockerfiles, notebooks and environment templates are read locally. Nothing is executed or uploaded.

Then

Resolve aliases against a reviewed registry

Dated snapshots, regional prefixes and version aliases resolve to canonical model identifiers with cited provider sources.

Last

Route every deadline to an owner

CODEOWNERS is used first, with git blame as fallback, and results are ranked by time remaining and blast radius.

A public registry you can challenge.

Every date carries the page it came from and the day a person last checked it. Nothing is scraped straight into your results — the refresher opens a pull request, and a person verifies it before it can change an answer. A model we cannot verify is reported as unknown, never as safe. The published registry currently holds 191 dated entries across 5 provider pages (anthropic, bedrock, cohere, google, openai), counted on 2026-09-17.

What these never do

Each check is pointed at something sensitive. The constraints are the product.

Never assert without evidenceEvery finding carries the file, line and source it came from, plus the registry version that produced it.
Never fail quietlyWhen a check cannot see something it reports unknown. It does not report clear.
Never upload your sourceAnalysis runs locally. Only findings leave the machine, and only if you connect the hub: paths, identifiers, line numbers, and the owner each finding is attributed to — a CODEOWNERS entry, or the email git blame records for that line. Never file contents. Every report prints its exact payload before sending.
Never copy argument textCredential paths and variable names are reported. Command argument text is structurally excluded from lock files, findings and reports instead of being hashed.
Never proxy your trafficNothing sits in a request path. Every check runs locally, in CI or on a laptop — no account, no upload.
Never write to your repositoryNo automatic pull requests, no config rewrites. Findings are annotations and exit codes.

Four scanners. One finding shape.

Ebb, Telltale, Charter, and Lading are public Apache-2.0 packages with dedicated product pages and CI Actions. Undertow remains a scheduled monitoring product, not an installable CLI.

ebb LLM deprecation scanner Available now Product page →
telltale OpenAPI telemetry coverage Available now Product page →
charter MCP capability drift scanner Available now Product page →
undertow Subprocessor change monitoring Hosted, not installable
lading AI asset licence checker Available now Product page →

Pricing

The four public scanners run free on your machine, forever, with no account. The hosted hub adds shared history and policy across a team: free for three repositories, and €39 a month when you need more.

Open-source scanners

Free

Apache-2.0 · unlimited repositories

  • Unlimited repositories
  • Terminal, Markdown, JSON and SARIF output
  • GitHub Action and pull-request annotations
  • Runs locally without an account

Foretop Hub Free

Free

Sign in with GitHub — no card, no sales call, no waitlist

Shared history, policy, ownership and evidence when one repository becomes ten.

  • 3 repositories, then 10 on Team
  • 30 days of finding detail, then 365 days on Team
  • 20 scans per repository each day, then 200 on Team
  • Shared policies and baselines
  • Ownership, escalation and expiring suppressions
  • Dated evidence exports

First sign-in creates your organization and you can mint a CI token yourself. Need self-hosting, or more than Team covers? Tell us about your setup.

Foretop Hub Team

€39 /month incl. tax

For teams tracking drift across up to 10 repositories

  • 10 repositories
  • 365 days of finding detail
  • 200 scans per repository each day
  • Shared ownership and review
  • Repository history and comparisons
  • Policies and expiring suppressions
  • Dated evidence exports

Prices include tax. Paddle is our merchant of record and calculates, collects and remits the applicable VAT or sales tax out of the price shown, so the amount you see is the amount you are charged. Cancel from the billing portal at any time; cancellation takes effect at the end of the paid period.