−25%

på Windows ved årlig betaling, til 31/10. Se pakkerne

EQVPS
Kom i gang

Sandbox til kodegennemgang og PR-tjek: bevis, at en patch virker, før du godkender den

En diff fortæller, hvad en patch påstår. En kørsel fortæller, om det passer. Check en pull request ud i en engangs-microVM, genskab fejlen før og efter, kør testene, og gennemgå med beviser – for omkring en halv cent pr. omgang.

En diff viser, hvad en patch påstår at gøre. Den viser ikke, om fejlen faktisk er væk, om den nye gren i en if nogensinde køres, eller om opgraderingen af en afhængighed ødelægger importen ved en ren installation. Reviewere ved det, og derfor ender så mange gennemgange med „LGTM, forudsat at testene består“.

Med AI-skrevne patches bliver hullet større. En model producerer hurtigt troværdig kode, og troværdig er præcis den slags, der glider forbi en træt reviewer. Den billige løsning er at køre ændringen, før nogen godkender den – et sted, hvor den ikke kan skade noget.

Tjekket: base, head, tests

Det mest overbevisende bevis, en patch kan levere, er en genskabelse, der fejler på den gamle kode og består på den nye. En sandbox gør det til et script på 20 linjer. Det er en Firecracker-microVM med Python 3.12, Node.js 22, git og curl, startet på cirka et sekund:

import os
from eqvps import Sandbox

REPO, BASE, HEAD = os.environ["REPO_URL"], os.environ["BASE_SHA"], os.environ["HEAD_SHA"]

def repro(sb, ref):
    sb.exec(f"cd /root/app && git checkout -q {ref}", timeout=55)
    return sb.exec("cd /root/app && python3 /root/repro.py", timeout=55).exit_code

with Sandbox.create(tariff="standard", ttl=1800) as sb:
    sb.exec(f"git clone -q {REPO} /root/app", timeout=55)
    sb.exec("cd /root/app && pip install -q -r requirements.txt", timeout=55)
    sb.upload("/root/repro.py", open("repro.py").read())
    before, after = repro(sb, BASE), repro(sb, HEAD)
    tests = sb.exec("cd /root/app && python3 -m pytest -q", background=True).wait()
    print(f"repro on base: {before}, on head: {after}; tests: {tests.state}, exit {tests.exit_code}")

repro.py er kodestumpen fra fejlrapporten. Afslutter den med en kode forskellig fra nul på base og med nul på head, retter patchen det, den påstår. Læg den linje plus testopsummeringen op som en kommentar på pull requesten, så starter reviewer med fakta.

Testsuiten kører som baggrundsopgave, fordi en enkelt synkron kommando stopper efter 55 sekunder. TTL på 30 minutter sætter loft over, hvor længe en kørsel, der hænger, kan koste penge.

Review-agenter, der kører kode

Samme idé virker for en AI-reviewer. Forbundet via MCP-serveren har en agent sandbox-værktøjer: opret en sandbox, kør en kommando, upload og download filer. I stedet for at skrive „det her kan ødelægge kompatibiliteten med Python 3.8“ checker den branchen ud, kører koden og citerer traceback – eller melder, at alt er i orden.

Giv sådan en agent et udgiftsloft og et skrivebeskyttet token, og beslut, hvilke værktøjer den må kalde uden at spørge. MCP-sikkerhedsforanstaltninger opstiller hvert værktøj efter risiko.

Hvilken tarif

RepositoryTarifTypisk omgangOmtrentlig pris
Lille bibliotek, ren Python eller JSsmall (0.5 vCPU, 1 GB)2 min$0.0011
Webapp med testsuitestandard (1 vCPU, 2 GB)5 min$0.0055
Native udvidelser, kompilerede afhængighederplus (2 vCPU, 4 GB)15 min$0.033

Midlertidige sandboxe afregnes pr. sekund med mindst 60 sekunder. Vil en reviewer vende tilbage til det samme miljø over et par dage, så opret det i stedet som persistent: det beholder sin disk i op til 30 dage og afregnes pr. påbegyndt time, så en standard-sandbox holdt til en todages gennemgang koster omkring $3.17. Slet den, når pull requesten er merget.

Grænser, der er værd at kende

  • To kommandoer ad gangen pr. konto. Rigeligt til gennemgange, der kører efter hinanden. Tjekker du snesevis af pull requests på én gang, stiller de sig i kø.
  • Ingen indgående porte. Du kan ikke åbne appen i en browser. Start den indeni, og test den med curl localhost fra en anden kommando.
  • Ingen Docker indeni. Tests, der starter containere, hører hjemme på en runner på en VPS.
  • Udgående internet er åbent. Det er det, der får pip install til at virke. Læg ikke noget i sandboxen, som du ikke ville give til patchens forfatter.

Kom i gang

Nye konti får $1 i sandbox-tid, hvilket dækker mere end hundrede review-omgange på tariffen standard. Sandbox-siden viser tarifferne, SDK-referencen hver metode brugt ovenfor, og Python-SDK på 5 minutter opsætningen.

Relateret: isolerede CI-testkørsler til hele pipelinen og sandbox til AI-agenter til de agenter, der skriver koden i første omgang.

Klar til at deploye? Betal med krypto, ingen KYC — live på cirka et minut.

Deploy nu →

FAQ

Hvordan adskiller det sig fra at køre CI på pull requesten?

CI svarer på, om de eksisterende tests består. Et review-tjek svarer på, om patchen gør det, den siger: det kører genskabelsen fra fejlrapporten på den gamle og den nye kode, prøver det grænsetilfælde, som bekymrer reviewer, og holder en sandbox klar, som reviewer kan rode i. De fungerer godt sammen.

Kan en AI-review-agent bruge det?

Ja, og det er der, det betaler sig mest. Via MCP får agenten værktøjer til at oprette en sandbox, køre kommandoer og læse filer. I stedet for at gætte på, om en ændring ødelægger noget, kører den koden og citerer outputtet i sin gennemgang.

Er det sikkert at checke en pull request ud fra en fremmed?

Det er hele pointen med sandboxen. Koden kører i en separat microVM med sin egen kerne, og der ligger intet af dit derinde ud over det, du selv lægger der. Giv ikke et token med, der kan skrive til dit repository; til private repositories er et skrivebeskyttet token nok.

Kan jeg åbne appen fra pull requesten i min browser?

Nej. Sandboxe har ingen indgående porte, så intet udefra kan forbinde til dem. Du kan starte appen indeni og teste den med curl fra en anden kommando eller lægge previews på en VPS, hvis reviewere skal klikke sig gennem en brugerflade.

Hvad koster en review-omgang?

En typisk omgang – klon, installer, genskab to gange, kør tests – tager et par minutter på tariffen standard og koster omkring $0.005. Du betaler pr. sekund med mindst 60 sekunder, fra en forudbetalt saldo.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.