Built on Nebius Token Factory + NVIDIA Nemotron

Dependabot bumps the version. Rivet makes the upgrade work.

Mention the bot and Rivet works out which package is vulnerable itself: it reads the advisory, researches the breaking changes, plans the fix, and iterates in a Token Factory Sandbox until your tests pass. At most one draft PR, or an honest no.

Start Building
> @rivetbot upgrade pyjwt

Comment it on any GitHub issue. No package to install.

acme/ticketdesk#1rivet/1-8b9221f4
pyjwt 1.7.12.13.01m 46s
Advisory targetGHSA-ffqj-6fqr-9h24
ORACLE EXECUTIONToken Factory Sandbox
FAILED test_create_and_list
FAILED test_link_roundtrip
FAILED test_peek_ignores_signature
18 failed, 2 passed
Verified diffsrc/ticketdesk/auth/links.py
- jwt.encode(payload, key, algorithm="HS256").decode("ascii")
+ jwt.encode(payload, key, algorithm="HS256")
- except jwt.ExpiredSignature:
+ except jwt.ExpiredSignatureError:
20 passed · re-audit clean, 0 advisories
EXIT 0
Draft PR #2 opened. Total cost: $0.1196.Verification complete
At most 1

Draft PR per issue

No PR spam, no broken builds

Never

Edits your tests

Tests must pass — they stay the frozen oracle

$0.12

Typical run cost

This run: $0.1196 in 1m 46s

0

Invented versions

Advisories and fixed versions come from OSV.dev

Four triggers, one engine

Start it however fits your workflow.

Every path below runs the same pipeline: OSV detection, Tavily research, a Token Factory Sandbox, and Nemotron. Only the trigger changes.

Mention

@rivetbot upgrade pyjwt, or just @rivetbot and it works out the package itself.

Label

Add the rivet label to an issue. Same effect as a bare mention.

Check first

@rivetbot check replies with a report and starts no run.

Automatic

A Dependabot alert starts a run on its own, with no comment at all.

@rivetbot checkchanges nothing
PackageInstalledFixed inSeverity
python-dotenv1.0.01.2.1high
requests2.25.02.32.4medium
flask1.1.23.0.3low

Reply with @rivetbot upgrade <package> to start one.

3 vulnerable dependenciestick a box to start
  • python-dotenv1.0.01.2.1high
  • requests2.25.02.32.4medium
  • flask1.1.23.0.3low

Each checked box opens its own draft PR — never more than one per package per run.

Architectural pipeline

Four bounded, reproducible phases.

Rivet does not touch your repo directly. Every phase runs against one sandbox checkpoint, with up to three retries before it gives up and says why.

01 / DETECT

Vulnerability mapping

Cross-references your lockfile against OSV.dev and the GitHub Advisory Database. Nothing is flagged without a real advisory ID and a fixed version.

OSV.dev & GHSA sync
02 / RESEARCH

Changelog extraction

Tavily Search finds the vendor changelog and migration notes; Tavily Extract reads the pages, so the fix follows real docs instead of a guess.

Tavily Search + Extract
03 / SANDBOX

Checkpoint and iterate

A Token Factory Sandbox checkpoints your repo, installs the bumped dependency (sandboxes keep network access for installs), and runs your test suite until it is green or the attempt gives up.

Token Factory Sandboxes
04 / REVIEW

Independent review

Nemotron Lightning writes the fix inside the sandbox loop; Nemotron Super reviews only the winning diff and checks it actually resolves the advisory before a PR opens.

Nemotron Super + Lightning

Stuck after a retry, the sandbox restores the checkpoint and tries again — up to three attempts per issue.

The Mill

Watch every step, live.

Every stage, attempt, sandbox operation and model call is a row while the run happens — not a log dump after the fact. This is a static mock of the real run detail page, not a screenshot.

ticketdesk-demo#1
pyjwt 1.7.1 → 2.13.0107s$0.13

Stages

  1. Checkpoint

    baseline: 20 passed

  2. Detect

    OSV.dev: 6 advisories

  3. Research

    2 Tavily calls

  4. Plan

    Nemotron Super

  5. Attempt 1

    18 failed → 20 passed

  6. Re-audit + review

    clean, approved

5 steps this attempt · 18 sandbox operations total

Model calls · 7

  • Nemotron Superwork order1.4k in / 0.4k out
  • Nemotron Lightningedit tokens.py2.1k in / 0.3k out
  • Nemotron Lightningedit links.py1.9k in / 0.2k out
  • Nemotron Lightningedit inspect.py1.8k in / 0.2k out
  • Nemotron Lightningrun tests: green0.6k in / 0.1k out
  • Nemotron Superreview diff1.6k in / 0.5k out
  • Nemotron Superreject/approve0.4k in / 0.1k out

Sandbox ops · 18

  • upload repo → checkpoint image
  • install deps (uv)
  • run baseline tests
  • bump pyjwt to 2.13.0
  • run tests (red)
  • apply edit, re-run (×14 more)
  • run tests (green)
  • diff checkpoint → head
  • re-audit: OSV + pip-audit

Sources · 2 Tavily calls

  • Advisory: GHSA-ffqj-6fqr-9h24osv.dev
  • Changelog: PyJWT 2.13.0 changelogpyjwt.readthedocs.io

Empirical comparison

A version bump is not an upgrade.

Standard bump bots change one line in your lockfile and leave the breaking changes to you. Rivet reads the migration guide and fixes your code until the real test suite is green.

Standard bump bot (Dependabot / Renovate)CI red

Blind bump to the manifest, no verification of dependent API breaks. The regression research becomes your afternoon.

pyproject.toml
- pyjwt==1.7.1
+ pyjwt==2.13.0

CI failed after the bump

18 tests failed: test_create_and_list and 17 others, mostly AttributeError on renamed exceptions and a str that used to be bytes.

Rivet upgrade run1m 46s

Pre-flight reproduction, changelog research, and a sandbox loop that edits until the suite is green. Yields one pass-verified draft PR, or none.

src/ticketdesk/auth/links.py
- jwt.encode(payload, key, algorithm="HS256").decode("ascii")
+ jwt.encode(payload, key, algorithm="HS256")
- except jwt.ExpiredSignature:
+ except jwt.ExpiredSignatureError:

Sandbox attested: 20/20 tests passing

Re-audit clean, draft PR opened. Merge stays yours.

Draft PR #2, $0.1196, your turn to merge

On the issue

What you get on the PR.

Verified commits

Every commit on the branch is signed as rivetbot[bot], not your name.

A draft PR

The advisory, the tests that now pass, the sources Rivet read, and the cost — in the PR body.

A check run

“Rivet upgrade” links back to the live run in the dashboard, from the PR itself.

Reactions for progress

An eyes reaction while working, a rocket when a PR opens, a confused face when there's no safe upgrade.

Compute economics

Itemized run ledger

Real cost from the pyjwt upgrade run on this page. No token markups or hidden fees — Token Factory list prices, billed per call.

RIVET RUN LEDGER // 8b9221f4
acme/ticketdesk#1 (pyjwt 1.7.12.13.0)
Subsystem / operationCost (USD)
Nemotron Super$0.0098
Nemotron Lightning$0.0017
Token Factory Sandboxes$0.1081
Tavily$0.00 (free tier)
Total run cost$0.1196
4 files changed, one green attempt, one draft PRToken Factory list prices: Lightning $0.06/$0.24, Super $0.30/$0.90 per 1M tokens

Start with one repo and one issue.

Connect your GitHub repository in less than sixty seconds. Comment @rivetbot upgrade on one advisory or breaking version bump, and read the verified sandbox log.

Powered by NVIDIA Nemotron, Nebius Token Factory, Token Factory Sandboxes, and Tavily.