尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
A model that scores live Wikipedia edits, publishes every forecast before the outcome exists, and replaces itself when its own accuracy decays.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A model that notices it is getting worse, and replaces itself.
Bellwether scores English Wikipedia edits for the probability they will be reverted, publishes each score before the outcome exists, grades itself when the outcome arrives, and — when its own accuracy decays — retrains, shadow-tests and replaces its own model without human instruction, recording the evidence for every decision in a public, append-only log.
Live status · Performance · Model timeline · About
The full answer is in the decision memo — two pages, no technical background needed. The short version:
This project does not claim its model is good. The claim is that the system can be trusted about the model.
A ranking model deployed against a live stream decays from the moment it ships, because the behaviour it ranks is generated by people whose behaviour changes. Almost every deployed model is evaluated once, before launch, against a held-out sample of the past — and thereafter trusted. Nobody measures whether it is still right, nobody defines in advance what "no longer right" means, and the decision to replace it is made by someone who has already seen which replacement won.
Can a system detect its own decay, replace its own model, and be trusted to have done so honestly?
| Commits before it knows | Every score is written to a register the writer role cannot UPDATE or DELETE — enforced by database grant, not by careful code |
| Waits for the answer | A prediction enters a published figure only once its outcome has actually settled, by a rule requiring both elapsed time and an observation |
| Decided in advance | PREREGISTRATION.md fixed the promotion rule, thresholds and statistical test before the first model existed. The constants live in code and are asserted against that document by the test suite |
| Publishes refusals | Every rejected challenger appears with the same evidence a promotion would carry. A log holding only changes cannot answer what was refused |
| States the bad news | The ablation finding, the twelve inert features, and the expectation that Wikimedia's own model wins — all published, all recorded before the results were seen |
MediaWiki API ─▶ ingest ─▶ score ─▶ append-only register
│ │
▼ ▼
labels ──────────────▶ metrics ─▶ triggers ─▶ retrain
│ │
▼ ▼
decisions ◀─ shadow
| Layer | Choice | Why |
|---|---|---|
| Pipeline | Python 3.13, scikit-learn | — |
| Database | Neon PostgreSQL | Append-only enforced by REVOKE; row-level security for the app |
| Scheduler | GitHub Actions | The only option unlimited and free on public repositories |
| API | FastAPI on Render (free) | Holds a read-only role; a separate role for the app that cannot touch evidence |
| Frontend | Next.js on Vercel | — |
Total infrastructure cost: zero. Not an incidental property — a constraint that shaped the design, including the parts that are worse for it.
| Job | Cadence |
|---|---|
| Ingest + score | every 10 minutes |
| Label harvest | every 30 minutes |
| Metrics | every 6 hours |
| Reconcile · Reproduce · Lift Wing · Triggers · Decide · Agreement | daily |
| Watchdog | hourly |
| Seal + retention | monthly |
DECISION_MEMO.md | What the system found. Two pages, non-technical |
METHODS.md | Every statistical procedure, and every exclusion with the direction of its bias |
PREREGISTRATION.md | The rules, fixed before any model existed |
Bellwether_SRS_v1.0.md | The full specification, with four dated amendments |
Bellwether_M*_Spec.md / _Summary.md | Per-milestone specifications and findings |
No authentication required.
/health liveness, and which migrations the database has
/stats ingestion, coverage gaps, matured revert rates
/register predictions, scoring lag, reproducibility
/metrics live figures per population, every one with its n
/kc2 the offline backtest, its margin, and the ablation
/calibration reliability bins, raw and population-weighted
/decisions every promotion, rejection and rollback with its evidence
/agreement how good a proxy "was reverted" is for "was a bad edit"
Stated here rather than buried.
python -m venv .venv && .venv/Scripts/pip install -r requirements-dev.txt
python scripts/bootstrap_database.py "<owner-connection-string>"
pytest -q && mypy bellwether && ruff check . && ruff format --check .
449 tests. The suite includes the append-only guarantees, which are checked by connecting as the restricted role and attempting the forbidden action — a grant cannot be tested against a mock.
Author: Muhammad Haris Khokhar · Source