Skenande CI
En kodagent som pushar, kör om eller öppnar pull requests i en loop kan göra av med dina runner-minuter på några timmar, och inget säger till förrän mejlet om 80 % förbrukning. fremforge håller utkik efter det.
Vad som mäts
Var 5:e minut tittar fremforge, för varje organisation, på de senaste 60 minuternas Actions-körningar på de hostade runnerna och mäter:
| Signal | Vad | Gräns |
|---|---|---|
| Körningar per person | Körningar som en person startat i organisationen | Över 3 gånger personens mest belastade normala timme, och aldrig under 80 |
| Runner-minuter per person | Runner-minuter som de körningarna använt | Över 3 gånger personens mest belastade normala timme, och aldrig under 600 |
| Pushar till en pull request | Olika commits som en person pushat till en och samma pull request | Fler än 12 |
”Personens mest belastade normala timme” är personens timme vid 99:e percentilen under de senaste 14 dagarna, och den räknas om en gång per dygn. En person med färre än 20 aktiva timmar under den tiden mäts i stället mot organisationens mest belastade normala timme. Ett team vars agenter kör CI hela dagen mäts alltså mot sin egen normalnivå, inte mot ett lugnare teams.
Gränsen för pull requests räknar pushar, inte körningar: en push startar lika många körningar som repot har arbetsflöden för den.
Det som mäts är alltid en person. En körning som en agent startar för någons räkning är den personens körning (körningens utlösande användare), och det finns inga agentkonton. Bottar, till exempel Renovate, mäts på samma sätt och märks som bottar. Körningar som fremforge själv startar, till exempel uppdateringar av lockfiler, mäts inte.
Kalibrering
Gränserna sattes utifrån en månads CI där de flesta körningar kommer från kodagenter. När den månaden spelas upp genom detektorn utlöses ingen varning om skenande CI så snart varje person har 14 dagars historik.
Vad som händer
När ett värde passerar sin gräns registrerar fremforge skenande CI, en gång:
- Ett mejl till alla ägare av organisationen som namnger personen, var det sker (organisationen eller en enskild pull request) och siffrorna.
- Ett mejl till personen vars körningar det gäller, skrivet till hen, så att hen kan stoppa sin session. Inte för en bot, och en ägare vars körningar det gäller får ett mejl, inte två.
- En
ci.runaway-händelse i händelseflödet, en per repo som körningarna finns i, så att en agentsession som läser flödet också ser den. - En granskningshändelse (
ci_runaway.detected). - En rad på sidan för CI-användning (se I konsolen).
Så länge värdet ligger över gränsen uppdateras varningen, men inget nytt mejl skickas. Den avslutas av sig själv efter 60 minuter under gränsen igen.
Inget stoppas om inte din organisation har slagit på pausen.
Pausen (tillval)
Med pausen påslagen hindrar en varning om skenande CI dessutom fremforges runners från att starta personens nya körningar, eller vid skenande CI på en pull request personens nya körningar på den pull requesten, tills en administratör återupptar dem. Pausen är av som standard.
Det här gör pausen aldrig:
- Den avbryter aldrig något. En körning som hålls tillbaka väntar i kön, visas som pausad under Utforska → Actions och startar inom några sekunder efter att den återupptagits.
- Den stoppar aldrig en körning som har startat. En körning med ett jobb som redan körs blir klar, inklusive sina senare jobb.
- Den håller aldrig tillbaka någon annan. Bara körningar som den pausade personen utlöst (på den pausade pull requesten) får vänta.
- Den släpper igenom vid fel. Om fremforge inte kan läsa pausen startar körningarna som vanligt.
Den håller bara tillbaka fremforges hostade runners. En runner som din organisation själv driver kan fortfarande ta jobbet.
En pausad varning avslutas inte av sig själv. En ägare återupptar den, eller slår av pausen, vilket återupptar alla pausade varningar på en gång. Efter ett återupptagande flaggas samma person inte igen på 60 minuter.
Forgejos schemalagda arbetsflöden (användaren forgejo-actions) mäts och larmar, men pausas aldrig.
I konsolen
Organisationens ägare hittar varningarna under Bygg och driftsätt → CI-användning, avsnittet Skenande CI (https://frem.sh/<org>/_admin/ci-usage#runaways): först pausomkopplaren, sedan varje varning med person, var, mest belastad timme, status och en knapp Återuppta (eller Avfärda). En banderoll högst upp på sidan visar när en varning är aktiv.
API
Token behöver runners:read för att lista och runners:write för att återuppta eller slå om pausen. Varje ändring loggas i granskningsloggen som den person anroparen agerar för.
# List (state=live for open and paused only)
curl https://frem.sh/_app/api/v1/orgs/<org>/ci-runaways \
-H "Authorization: Bearer $FREMFORGE_TOKEN"
# Turn the pause on (or off: off resumes every paused runaway)
curl -X PUT https://frem.sh/_app/api/v1/orgs/<org>/ci-runaways/settings \
-H "Authorization: Bearer $FREMFORGE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pause": true}'
# Resume one (or close an open one)
curl -X POST https://frem.sh/_app/api/v1/orgs/<org>/ci-runaways/<id>/resume \
-H "Authorization: Bearer $FREMFORGE_TOKEN"En varning i listan:
{
"id": "4f0c…",
"status": "paused",
"scope": "pr",
"person": "alice",
"person_kind": "person",
"repo": "api",
"pr_number": 42,
"signals": ["pr_pushes"],
"runs": 48,
"heads": 16,
"minutes": 0,
"detected_at": "2026-10-25T09:40:00.000Z",
"paused_at": "2026-10-25T09:40:00.000Z",
"resumed_at": null
}status är open (larm skickat), paused, ended eller resumed. MCP-servern listar dem med list_ci_runaways.
Stoppa själva loopen
Larmet talar om vems arbete som går i loop; sessionen är den personens. Stoppa agentsessionen, eller återkalla den token den använder. Med token för någons räkning (on-behalf-of) stoppar du sessionen genom att återkalla den delegerade token, utan att röra personens övriga arbete.