Guider

Feil i sandkassen

Slå opp på feilmeldingen du ser. Hver oppføring sier hva som skjer, og hvilken kommando som løser det.

brew update
brew upgrade navikt/tap/nav-pilot navikt/tap/cplt
copilot update    # Copilot CLI
opencode upgrade  # hvis du bruker opencode

Start her

Eldre cplt? Oppgrader først. Flere feil er rettet i cplt fra 29. september 2026: pnpm fikk ikke lese sin egen konfig (EPERM … pnpm/config.yaml), pakker med en .claude-mappe kunne ikke installeres (ERR_PNPM_EPERM), og en egen host-liste stengte Copilot ute fra innloggingen (Sign-in failed).

Finner du ikke feilen under, spør cplt selv:

cplt check                               # virker sandkassen?
cplt check net registry.npmjs.org        # slipper proxyen gjennom denne hosten?
cplt check path ~/.npmrc                 # får agenten lese eller skrive denne fila?
cplt config set proxy.log_level blocked  # vis blokkerte nettverkskall mens agenten jobber
cplt config explain sandbox.allow_env_files  # hva gjør en nøkkel?

Svarene fra cplt check har en linje som begynner med Reason:, og ofte en med Fix:. Flere detaljer står i known-impacts.md (engelsk).

Versjon og konfig

unknown config key

cplt kjenner ikke nøkkelen. Meldingen lister de gyldige. Står nøkkelen der, er den skrevet feil. Står den ikke der, er din cplt eldre enn dokumentasjonen. Oppgrader.

.cplt.toml uses a key this version of cplt does not understand

Repoets .cplt.toml er skrevet for en nyere cplt enn din, som hopper over nøkkelen. Står den under [deny], blir en begrensning repoet ber om, ikke brukt. Oppgrader cplt. Gjelder meldingen din egen konfig (unknown key '…' in [seksjon]), sjekk fila:

cplt config validate

the [audit] section was removed

[audit] gjorde aldri noe, og cplt avviser nå alle audit.*-nøkler. Slett seksjonen fra ~/.config/cplt/config.toml. Vil du ha en logg over nettverkskallene, bruk proxy.log_file:

cplt config set proxy.log_file ~/cplt-proxy.log

Rapporten over filene agenten endret, sandbox.audit, er på som standard.

Nettverk

BLOCKED-ALLOWLIST

Hosten står ikke på host-lista. Når proxy.allowed_domains er satt, slipper proxyen bare gjennom agentens egne hoster, hostene i fila og i allow.domains, og pakkeregistrene hvis proxy.default_allowlist er på. Fila nav-pilot skriver, har pakkeregistrene. Finn fila og legg til hosten:

cplt config get proxy.allowed_domains   # viser hvilken fil
echo min.host.no >> <fila>
cplt check net min.host.no               # BLOCKED før, ALLOWED etter

Én host per linje. Mangler npm, Maven Central eller andre pakkeregistre, slå på proxy.default_allowlist:

cplt config set proxy.default_allowlist true

cplt doctor sier fra når nettverksreglene stenger ute agentens hoster eller pakkeregistrene.

Failed to CONNECT: 403 Forbidden — Private target blocked by cplt

Hosten peker til en privat IP-adresse, for eksempel repo.adeo.no eller en tjeneste på intern.nav.no. cplt stopper slike kall som vern mot SSRF. Proxyloggen viser BLOCKED-PRIVATE eller BLOCKED-PRIVATE-RESOLVED. Tillat domenet ved navn. Underdomener blir med:

cplt config set proxy.allow_private_domains repo.adeo.no
cplt config set proxy.allow_private_domains intern.nav.no

En adresse skrevet som IP, for eksempel https://10.20.30.40/, kan ikke åpnes. Bruk DNS-navnet i stedet.

Sandbox is NOT ENFORCING

Sandkassen slapp gjennom noe den skulle stoppe. Meld det i navikt/cplt. Oppgrader og kjør cplt check på nytt før du melder, for eldre cplt viste meldingen også når sandkassen blokkerte noe den skulle slippe gjennom.

policy too strict

Sandkassen virker, men konfigen din stenger noe agenten trenger. Linja under den feilede sjekken sier hva og hvorfor. En vanlig årsak er en egen host-liste, se BLOCKED-ALLOWLIST.

connect EPERM 127.0.0.1

cplt stenger localhost på macOS. Åpne porten til tjenesten du trenger, for eksempel PostgreSQL:

cplt config set allow.localhost 5432

Verktøy som bruker tilfeldige porter, som Next.js, Vite, esbuild og Gradle, trenger alle portene:

cplt config set sandbox.allow_localhost_any true

Gjelder det hele teamet, legg det i repoet, se Det stakken din trenger.

Filer og programmer

Operation not permitted, EPERM eller EACCES

Sandkassen nektet tilgang til en fil. Spør cplt om stien:

cplt check path <sti>

Stien sier som regel hvor du skal lete videre:

EPERM: operation not permitted, open …/.yarnrc

yarn 1 stopper når den ikke får lese ~/.yarnrc. Gi lesetilgang til fila:

cplt config set allow.read ~/.yarnrc

Samme feil for ~/.npmrc (på Linux EACCES) trenger det samme, også når prosjektet bare henter offentlige pakker:

cplt config set allow.read ~/.npmrc

fatal: cannot hash .env.local

Gjelder macOS. Fila er sporet i git og endret, og cplt stenger lesing av .env-filer, så git diff, git add og git commit -a stopper. En fil med hemmeligheter hører ikke hjemme i git. Slutt å spore den:

git rm --cached .env.local
echo ".env.local" >> .gitignore

Operation not permitted på .env-filer

Gjelder macOS. På Linux kan agenten lese og skrive disse filene. cplt stenger både lesing og skriving av .env og .env.*, og av filer som heter .pem, .key og lignende. Next.js og dotenv får tomme variabler, og tester som skriver slike filer, feiler. Åpne dem hvis prosjektet trenger det:

cplt config set sandbox.allow_env_files true   # alltid
cplt --allow-env-files                          # bare denne økten

Da kan agenten lese alle slike filer i prosjektet, også hemmelighetene i dem.

fatal: unable to access ~/.config/git/work: Permission denied

Git-konfigen din har en includeIf som peker på en fil i ~/.config/git. Der får agenten bare lese config, ignore og attributes, og git stopper når en include ikke kan leses. På macOS står det Operation not permitted. Gi lesetilgang til fila, ikke hele mappa:

cplt config set allow.read ~/.config/git/work

execvp() of /bin/ps failed: Operation not permitted

Gjelder macOS. Programmer som kjører med rettighetene til eieren (setuid), som ps, top og sudo, kan ikke startes i sandkassen. Fra Go ser feilen ut som fork/exec /bin/ps: operation not permitted. Ingen innstilling åpner det. Kjør kommandoen utenfor cplt. cplt check exec /bin/ps svarer BLOCKED.

openpty: Operation not permitted

Programmer som lager sin egen terminal, som script, tmux, screen, pexpect og node-pty, får ikke lov i sandkassen. Den kunne ellers lest det du skriver i andre terminalvinduer. Vanlige programmer i terminalen din virker. Kjør slike kommandoer utenfor cplt.

Java, Kotlin og Gradle

Oppsettet for Gradle-prosjekter står i Kotlin og Gradle i sandkassen.

Could not connect to the Gradle daemon / ConnectException: Could not connect to server

Ser du bare Last 20 lines from daemon log file, som slutter med Daemon server started, står feilen lenger opp i utdataene. Gradle-daemonen og Kotlin-daemonen snakker sammen over tilfeldige porter på localhost, og cplt stenger localhost. --no-daemon hjelper ikke, for Gradle starter da som regel en daemon for ett enkelt bygg og kobler seg til den over localhost. Åpne alle portene:

cplt config set sandbox.allow_localhost_any true

Kommer feilen fortsatt med addresses:[/127.0.0.1], er det som regel ktlint eller detekt. Arbeidsprosessene deres får ikke med innstillingene cplt setter. Kjør disse oppgavene utenfor cplt, for eksempel ./gradlew ktlintFormat.

Operation not permitted når JVM-en starter

Gjelder macOS. Noen JVM-biblioteker lastes fra systemets temp-mappe før cplt har flyttet den. Bruk dette bare når feilen kommer mens JVM-en starter, ikke senere i bygget. Programmer i /tmp kan da kjøres, så cplt krever --force:

cplt config set sandbox.allow_tmp_exec true --force

Could not self-attach to current VM using external process

Gjelder macOS. MockK, Mockito og ByteBuddy kobler seg til JVM-en mens testene kjører, og det trenger en socket cplt stenger. Åpne den:

cplt config set sandbox.allow_jvm_attach true

På Linux stenger ikke cplt denne socketen, så der skyldes feilen noe annet.

JDK i ~/Library/Java

cplt støtter ikke JDK-er i ~/Library/Java/JavaVirtualMachines ennå. Pek JAVA_HOME på en JDK et annet sted, for eksempel under /Library/Java/JavaVirtualMachines, SDKMAN eller jenv.

Unable to download toolchain

Gradle prøver å laste ned en JDK til ~/.gradle/jdks, og den mappa er skrivebeskyttet i cplt på macOS. Feilen ser ut som et nettverksproblem, men det er skrivingen som stoppes. Kjør bygget én gang utenfor cplt, så ligger JDK-en klar. Eller bruk en JDK du har installert, i ~/.gradle/gradle.properties:

org.gradle.java.installations.auto-download=false
org.gradle.java.installations.paths=/Library/Java/JavaVirtualMachines/temurin-25.jdk/Contents/Home

cplt stenger ~/.gradle/gradle.properties. Legger du innstillingene der, må du åpne fila, se neste oppføring.

Har du en liste over tillatte hoster, stopper cplt også oppslaget mot api.foojay.io med BLOCKED-ALLOWLIST i proxyloggen, og Gradle kan melde det som tidsavbrudd. Legg til hosten, og hostene JDK-en hentes fra. For Temurin er det github.com og release-assets.githubusercontent.com, de samme som Gradle-wrapperen bruker:

cplt config set allow.domains api.foojay.io
cplt config set allow.domains github.com
cplt config set allow.domains release-assets.githubusercontent.com

Error when loading properties file

Hele meldingen er Error when loading properties file=/Users/…/.gradle/gradle.properties med (Operation not permitted). Gjelder macOS. cplt stenger fila fordi den ofte har tokens i seg, og Gradle stopper når fila finnes, men ikke kan leses. Ta tokenet ut og hent pakkene fra Navs speil, eller gi agenten lesetilgang til fila og alle tokenene i den:

cplt config set allow.read ~/.gradle/gradle.properties

Playwright, Cypress og Puppeteer

forbidden-sandbox-reinit

Chromium prøver å starte sin egen sandkasse, og det går ikke inne i cplt. Playwright MCP slår den på. Selve Playwright-biblioteket kjører uten. Playwright kjører dessuten nettleseren fra ms-playwright i cache-mappa, som cplt ikke lar programmer kjøre fra. Da står det Operation not permitted. Én innstilling løser begge:

cplt config set sandbox.allow_cache_exec ms-playwright

Mappa blir både skrivbar og kjørbar for agenten, og cplt slår av sandkassen til Chromium for Playwright MCP. cplt er da den eneste sandkassen rundt nettleseren. Starter du Chromium på en annen måte, sett --no-sandbox selv.

EPERM (1100)

cypress verify stopper under oppstart fordi Cypress kjører fra cache-mappa og trenger sitt eget område under ~/Library/Application Support/Cypress. Innstillingen Cypress åpner begge. Testkjøringer trenger i tillegg tilfeldige porter på localhost. Foreslå det i repoet, slik at alle i teamet får det:

cplt config set sandbox.allow_cache_exec Cypress
cplt config set --repo sandbox.allow_localhost_any true   # skriver til .cplt.toml
cplt trust accept --all                                    # godkjenn forslaget

spawn EPERM og [object Object] fra Puppeteer og mmdc

Error: spawn EPERM betyr at Puppeteer prøver å starte Chrome fra ~/.cache/puppeteer. På macOS får ingenting kjøre derfra, og --allow-cache-exec når ikke den mappa. Skriver mmdc bare [object Object], har Puppeteer prøvd å koble til nettleseren over localhost. Løsningen er en puppeteer.json som peker på nettleseren fra Playwright og har "pipe": true og --no-sandbox. Oppskriften står under Puppeteer og Mermaid-diagrammer i Node-guiden.

npx -y @mermaid-js/mermaid-cli stopper før det, med bad interpreter: Operation not permitted, fordi ingenting får kjøre fra ~/.npm. Installer pakken i prosjektet med npm install -D @mermaid-js/mermaid-cli.

Git og GitHub

error: could not write config file .git/config: Operation not permitted

Gjelder macOS. .git/config er skrivebeskyttet, fordi den kan få git til å kjøre kode utenfor sandkassen. Derfor fjerner cplt -u fra git push -u og skriver cplt: pushing without -u. Branchen blir pushet, og cplt setter upstream når økta er ferdig hvis pushen oppfyller kravene i Git og GitHub i sandkassen. Ellers skriver cplt en git branch -u-kommando du kjører selv utenfor cplt: når økta slutter, eller i meldingen når du pusher i en stille økt. Du klarer deg også uten upstream. Skriv branchnavnet når du pusher, og oppgi det når du lager pull requesten:

git push origin HEAD:min-branch
gh pr create --head min-branch

git config, git remote add, git clone og git init må du kjøre utenfor cplt.

BLOCKED by sandbox: 'git push' is not allowed in this environment.

Git-vakta stopper push til default branch og force push. main og master er alltid beskyttet, i tillegg til branchen origin peker på. Med strict stopper vakta all push. Lag en egen branch og push den:

git push origin HEAD:min-branch

cplt doctor viser om vakta slipper gjennom push til en ny branch i repoet ditt. Stopper vakta også push til en ny branch, og sier at the default branch of remote 'origin' could not be determined, vet den ikke hvilken branch som er default branch. cplt spør remoten når origin/HEAD mangler lokalt, og feilen kommer når remoten ikke svarer. Kjør dette utenfor cplt, og start en ny økt:

git remote set-head origin -a

BLOCKED by sandbox: 'git remote' would change a remote's URL.

gh-vakta bruker origin til å avgjøre hvilket repo agenten får jobbe mot. Derfor stopper git-vakta git remote add origin, git remote set-url origin og git config med remote.origin.url eller url.*.insteadOf. Det gjelder overalt i sandkassen, også i test-repoer i en temp-mappe, og det er med vilje. Andre remotes kan du endre. Lager testene dine egne repoer med origin, kjør dem uten git-vakta:

cplt --no-git-guard exec -- <kommando>

Alternativt kan vakta bare advare. Det gjelder alle øktene dine, så slå den på igjen etterpå:

cplt config set git_guard.mode warn --force
cplt config set git_guard.mode block

which is outside the startup repo

gh-vakta lar agenten jobbe mot repoet den startet i. Skal agenten jobbe i et repo til, legg det til. cplt finner utsjekkingen på maskinen din og sjekker at den er riktig repo:

cplt link navikt/annet-repo

aborted: you must first push the current branch to a remote, or use the --head flag

Uten terminal pusher ikke gh pr create for deg. Push først, og oppgi branchen:

git push origin HEAD:min-branch
gh pr create --head min-branch

Permission denied (publickey)

SSH-nøklene dine er stengt i sandkassen. Bruk HTTPS i stedet. Kjør dette utenfor cplt, fordi det skriver til git-konfigen:

git remote set-url origin https://github.com/navikt/<repo>.git
gh auth setup-git

error obtaining VCS status: exit status 128

Go-bygg i et git-worktree kan finne en annen .git-mappe lenger opp, som agenten ikke har tilgang til. Slå av versjonsstemplingen:

go build -buildvcs=false

GOFLAGS fra skallet ditt slipper inn i sandkassen. Hvordan du setter det for hele repoet med mise, står i worktree-guiden.

Agenten og innlogging

System vault not available

Gjelder Linux og WSL. Nøkkelringen nås over D-Bus, som cplt stenger, så agenten ber deg lagre tokenet i klartekst. Logg inn på maskinen din, og la cplt sende tokenet inn:

gh auth login                                        # utenfor cplt, én gang
cplt config set gh_guard.inject_token true --force

Tokenet ligger da i miljøet til alle prosesser i sandkassen, og alle kan lese det. Derfor krever cplt --force.

Sandboxing is disabled for this session because this host does not support it

Copilot CLI har sin egen sandkasse, og den kan ikke starte inne i cplt. cplt slår den av for økten, og Copilot sier fra med denne linja. Det er ventet, og innstillingene dine endres ikke. cplt er fortsatt sandkassen rundt agenten.

Henger Copilot rett etter oppstartsmeldingen, og organisasjonen din styrer Copilot-innstillingene, kan en policy kreve Copilots egen sandkasse. Det kan ikke cplt endre.

Operation not permitted i ~/Desktop eller ~/Documents

Gjelder macOS, og skjer også uten cplt. macOS beskytter disse mappene. Gi terminalen full disktilgang i Systeminnstillinger → Personvern og sikkerhet → Full disktilgang, og start terminalen på nytt. Eller kopier fila inn i prosjektet.

Andre problemer med nav-pilot står i feilsøkingsguiden, og hvordan sandkassen er satt opp, står i Sandkassen.

Rapporter et problem

Kjør cplt doctor, eller cplt doctor --agent claude for en bestemt agent, og lim inn hele utskriften sammen med kommandoen som feilet. Utskriften viser hjemmekatalogen som ~ og tokener bare med navn. Ikke send --verbose: den tar med fulle stier.

cplt doctor