Przejdź do głównej zawartości

Zaplanowane automatyzacje Codex, którym możesz zaufać bez nadzoru

Automatyzacje Codex to cykliczne prompty, na przykład codzienna kontrola jakości, które aplikacja desktopowa Codex uruchamia według harmonogramu w lokalnym projekcie albo w worktree Git, a wyniki odkłada do skrzynki. Uruchomienie bez nadzoru jest bezpieczne, gdy prompt przetestowano ręcznie, sandbox jest najwęższy z działających, a wynik spełnia sprawdzalny kontrakt.

Poniedziałek rano. W weekend opublikowano ostrzeżenie o podatności w zależności, ktoś zmergował commit z zabłąkanym console.log, a pokrycie testami modułu płatności spadło. O wszystkich trzech rzeczach dowiadujesz się na standupie. Gdybyś w piątek ustawił trzy automatyzacje, zamiast tego otworzyłbyś krótki raport: każdy znaleziony problem z poleceniem, które go dowodzi, a bezpieczne poprawki już gotowe w worktree do twojego przeglądu.

Ta strona jest dla programistów, którzy codziennie pracują z Codeksem, i dla tech leadów, którzy chcą tych samych cyklicznych kontroli w całym zespole. Zakłada, że znasz już aplikację desktopową albo CLI Codex; jeśli nie, zacznij od przeglądu automatyzacji Codex.

  • Tabelę decyzyjną: gdzie powinno działać cykliczne zadanie Codex — w aplikacji desktopowej, w automatyzacji wątku czy w harmonogramie CI.
  • Pięciokrokową procedurę, która prowadzi prompt od ręcznego uruchomienia do zaufanego harmonogramu.
  • Sześć promptów do skopiowania, każdy z kontraktem wyniku, który da się sprawdzić.
  • Konfigurację sandboksa i reguł dla uruchomień bez nadzoru, przetestowaną poleceniem codex execpolicy check.
  • Workflow GitHub Actions, który wykonuje to samo zadanie, gdy twój laptop śpi.
  • Listę awarii z procedurą naprawy dla każdej z nich.

Przygotowana przez OpenAI mapa powierzchni Codex opisuje automatyzację jako „scheduled checks, reminders, monitors, or follow-ups; use an existing-thread heartbeat when continuity matters”. To daje dwie opcje w aplikacji, a CLI dokłada kolejne dwie. Wybieraj według tego, do czego zadanie musi mieć dostęp i czy ma działać, gdy twój komputer jest wyłączony.

Gdzie działaDo czego ma dostępDziała, gdy laptop śpi?Najlepsze do
Aplikacja desktopowa, lokalny projekt lub worktreeTwoje repozytorium, lokalne narzędzia i dane logowaniaNieOsobistych kontroli wymagających lokalnego stanu: twoich gałęzi, lokalnych usług, niewypchniętej pracy
Aplikacja desktopowa, automatyzacja wątkuZa każdym razem ten sam wątek, więc wcześniejsze ustalenia zostają w kontekścieNieDziałań następczych, które muszą pamiętać wczoraj: „sprawdź ponownie to, co zgłosiłeś ostatnio”
codex exec z crona lub launchd na stale włączonej maszynieTo, co ta maszyna ma w repozytoriumTakZadania zespołowego na kontrolowanej przez ciebie maszynie buildowej; zobacz Codex bez interfejsu: codex exec
GitHub Actions schedule z openai/codex-action@v1Świeży checkout domyślnej gałęzi, tylko z sekretami, które przekażeszTakWspólnych raportów zespołu, które nie mogą zależeć od niczyjego laptopa; zużycie obciąża klucz API, a nie limit twojego planu

Aplikacja desktopowa Codex działa na macOS i Windows, a codex app otwiera ją z terminala. Od 2026-07-09 jest dostarczana jako tryb Codex aplikacji desktopowej ChatGPT (źródło wtórne: Neowin); na macOS codex app uruchamia każdą z nich. Automatyzacje w aplikacji są oznaczone jako stabilne w CLI 0.157.1 (in_app_local_automation w codex features list). Według stanu na 2026-08-28 strona automatyzacji OpenAI wymieniała obok harmonogramów także źródła zdarzeń: nowe wiadomości Gmail, wiadomości na kanałach Slacka i aktywność w pull requestach GitHub.

Jak przeprowadzić automatyzację od promptu do harmonogramu?

Dział zatytułowany „Jak przeprowadzić automatyzację od promptu do harmonogramu?”

Automatyzacja zaplanowana po jednym ręcznym uruchomieniu często okazuje się hałaśliwa. Poniższa procedura kosztuje jedno dodatkowe ręczne uruchomienie i oszczędza ci tygodnia zaśmieconej skrzynki.

  1. Napisz prompt z kontraktem wyniku. Określ zakres (katalogi, okno czasowe), co liczy się jako ustalenie, jakie dowody musi mieć każde ustalenie i jaką dokładnie linię wypisać, gdy nie ma nic do zgłoszenia. Każdy prompt na tej stronie kończy się takim kontraktem.

  2. Uruchom go ręcznie w zwykłym wątku w tym samym projekcie. Jeśli zadanie edytuje pliki, zacznij wątek w worktree, żeby główne repozytorium zostało czyste; konfigurację opisuje przewodnik po worktree w Codeksie. Sprawdź trzy rzeczy: czy znalazł prawdziwe problemy, czy został w zakresie i czy każde ustalenie ma dowód.

  3. Uruchom go drugi raz, niczego nie zmieniając. Dobra automatyzacja daje tę samą odpowiedź albo wypisuje NO FINDINGS. Jeśli drugie uruchomienie powtarza zgłoszenia albo wymyśla nowe problemy, zawęź zakres lub dodaj plik ignorowanych ustaleń (patrz sekcja o awariach), zanim ustawisz harmonogram.

  4. Utwórz automatyzację z przetestowanego promptu. W widoku Automations aplikacji desktopowej wybierz projekt, wskaż wykonanie lokalne albo w worktree, ustaw harmonogram i wklej prompt bez zmian. Wybierz automatyzację wątku, gdy zadanie musi pamiętać wcześniejsze uruchomienia.

  5. Oceń pierwsze trzy uruchomienia względem kontraktu, potem przejdź na próbkowanie. W każdym uruchomieniu sprawdź jedno ustalenie od początku do końca, wykonując jego polecenie odtwarzające. Po trzech czystych uruchomieniach wystarczy wyrywkowa kontrola jednego ustalenia w tygodniu; przejrzane uruchomienia archiwizuj.

Jaki sandbox powinno dostać uruchomienie bez nadzoru?

Dział zatytułowany „Jaki sandbox powinno dostać uruchomienie bez nadzoru?”

Podczas zaplanowanego uruchomienia nikt nie odpowie na prośbę o zgodę, więc projektuj każde zadanie tak, żeby nigdy jej nie potrzebowało. Wszystko, co wychodzi poza granicę, ma się nie udać i pojawić w raporcie, a nie czekać ani eskalować.

DostępNazwa starszego sandboksaProfil uprawnień (beta)Do czego
Czyta pliki, nic nie zapisujeread-only:read-onlyRaportów, briefingów, audytów i wszystkiego, co czyta treści ze Slacka, Gmaila lub PR-ów
Edytuje pliki w obszarze roboczymworkspace-write:workspaceZadań, które naprawiają coś w worktree do twojego przeglądu
Bez ograniczeńdanger-full-access:danger-full-accessNigdy w zaplanowanym zadaniu na twojej maszynie

OpenAI preferuje teraz profile uprawnień (Codex CLI 0.138.0 i nowsze) zamiast starszych wartości --sandbox i zaznacza, że „the profile and legacy sandbox systems do not compose”, więc wybierz jeden system na zadanie. Profil wybierasz kluczem default_permissions w ~/.codex/config.toml albo dla pojedynczego uruchomienia przez -c default_permissions=":read-only"; osobnej flagi CLI do tego nie ma. Ani workspace-write, ani :workspace nie daje dostępu do sieci. Gdy jedno polecenie naprawdę potrzebuje sieci, na przykład npm audit, dopuść prefiks tego polecenia regułą, zamiast poszerzać cały sandbox.

Reguły to pliki Starlark w ~/.codex/rules/. Ten plik pozwala uruchomić poza sandboksem dokładnie trzy polecenia potrzebne opisanemu niżej cotygodniowemu zadaniu zależności (npm outdated, npm audit i npm install) i nic więcej:

~/.codex/rules/default.rules
prefix_rule(
pattern = ["npm", "outdated"],
decision = "allow",
justification = "npm outdated reads the registry to compare versions",
)
prefix_rule(
pattern = ["npm", "audit"],
decision = "allow",
justification = "npm audit needs network access for vulnerability checks",
)
prefix_rule(
pattern = ["npm", "install"],
decision = "allow",
justification = "npm install downloads the patched package versions",
)

Przetestuj każdą regułę, zanim zaplanowane uruchomienie zacznie na niej polegać. Uruchom te polecenia w terminalu; każdy wynik JSON powinien kończyć się "decision": "allow", a polecenie, którego nie dopuściłeś, na przykład npm publish, powinno zwrócić pustą listę matchedRules (sprawdzone w CLI 0.157.1):

Okno terminala
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- npm outdated
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- npm audit
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- npm install lodash@4.17.21

npm install jest z tych trzech najszersze: poza sandboksem uruchamia też skrypty cyklu życia instalowanych pakietów z uprawnieniami twojego użytkownika. Jeśli to więcej, niż chcesz dopuścić na własnej maszynie, uruchamiaj zadanie zależności z harmonogramu CI.

Opisane niżej zadania raportujące działają w read-only, gdzie git fetch nie ma sieci i nie może zapisywać w .git, a gh nie łączy się z GitHubem. Ich prompty korzystają więc z origin/main w stanie z ostatniego pobrania i podają, jak stary jest ten stan. Żeby odświeżać repozytorium przy każdym uruchomieniu, dodaj do tego samego pliku jeszcze dwie reguły. Lista w drugim wzorcu dopuszcza gh pr list i gh pr view, ale nie gh pr merge:

prefix_rule(
pattern = ["git", "fetch"],
decision = "allow",
justification = "git fetch needs the network and writes to .git",
)
prefix_rule(
pattern = ["gh", "pr", ["list", "view"]],
decision = "allow",
justification = "the daily briefing reads merged pull requests",
)
Okno terminala
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- git fetch origin
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- gh pr view 123
codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- gh pr merge 123

Dwa pierwsze zwracają "decision": "allow"; gh pr merge zwraca pustą listę matchedRules (sprawdzone w CLI 0.157.1).

Jeśli nowa reguła nie działa, zrestartuj aplikację. Sekcja o testowaniu sandboksa w przewodniku po zaawansowanych konfiguracjach pokazuje, jak udowodnić, że granica trzyma dla poleceń, których nie dopuściłeś.

Każdy prompt testujesz w zwykłym wątku, zanim trafi do harmonogramu, i każdy kończy się kontraktem wyniku. Zastąp skrypty npm poleceniami swojego projektu; reszta działa bez zmian.

To zadanie edytuje pliki i potrzebuje sieci dla trzech poleceń, więc zaplanuj je w worktree z workspace-write i wszystkimi trzema regułami opisanymi wyżej. Z samą regułą dla npm audit kroki 1 i 3 zawodzą przy każdym zaplanowanym uruchomieniu.

To zadanie zapisuje testy, więc zaplanuj je w worktree z workspace-write.

Na twojej maszynie gh potrzebuje sieci i zalogowanej sesji, więc dodaj regułę gh pr z sekcji o sandboksie. W CI profil tylko do odczytu nie ma sieci w ogóle, a opisany niżej workflow nie przekazuje Codeksowi tokenu GitHub, więc pobierz pull requesty w kroku przed uruchomieniem Codeksa i pozwól promptowi przeczytać prs.json:

permissions:
contents: read
pull-requests: read
steps:
# checkout and npm ci as in the workflow below, then:
- name: Fetch merged PRs for the briefing
env:
GH_TOKEN: ${{ github.token }}
run: |
gh pr list --state merged \
--search "merged:>=$(date -u -d yesterday +%F)" \
--json number,title,body,url,author > prs.json

Skill trzyma procedurę w jednym pliku, a prompt automatyzacji kurczy się do jednej linii. Gdy ulepszasz skill, ulepsza się każda automatyzacja, która go wywołuje. Codex szuka osobistych skilli w $CODEX_HOME/skills (w ~/.codex/skills, gdy CODEX_HOME nie jest ustawione), a skill-creator to jeden z przykładowych skilli dołączonych do Codeksa.

---
name: recent-code-bugfix
description: Find bugs in the current author's recent commits and prove each
with a failing test; propose, do not apply, a fix.
---
# Recent code bugfix
1. Take the time window from the invoking prompt and list the author's commits in it:
git log --since=<window> --author="$(git config user.email)".
2. In each changed file, look for off-by-one errors, unhandled promise rejections and
missing error handling, race conditions, and missing null or undefined checks.
3. Confirm each suspected bug: read the surrounding code and related tests, then write
a failing test that demonstrates it. Only report bugs with a failing test.
4. Propose the smallest fix as a diff; do not apply it.
5. Per bug, report: commit SHA, file:line, one-sentence root cause, the failing test's
path and its failure output, and the proposed diff. Do not report theoretical concerns.
6. If nothing is confirmed, print exactly: NO FINDINGS

Prompt automatyzacji wygląda wtedy tak:

Run $recent-code-bugfix on my commits from the last 24 hours.

Skille zespołowe trzymaj w repozytorium, w .agents/skills/, a nie w ~/.codex/skills, żeby zmiana skilla przechodziła code review jak każda inna zmiana. Przewodnik po aplikacji desktopowej Codex pokazuje, gdzie aplikacja wyświetla zainstalowane skille.

Jak zweryfikować wynik automatyzacji bez czytania każdej linii?

Dział zatytułowany „Jak zweryfikować wynik automatyzacji bez czytania każdej linii?”

Większość pracy wykonuje kontrakt wyniku. Ponieważ każde ustalenie ma polecenie odtwarzające albo padający test, sprawdzasz je jednym poleceniem, a nie lekturą analizy. Stosuj cztery zasady:

  1. Dowód przy każdym ustaleniu. Ustalenie bez file:line i polecenia, które je odtwarza, to szum. Odrzuć je i zaostrz prompt.
  2. Zmiany przechodzą zwykłą bramkę. Poprawka zrobiona w worktree staje się gałęzią i pull requestem, a CI uruchamia te same bramki typów, lintera i testów co dla zmian ludzi. Nic, co napisze automatyzacja, nie trafia do main bez nich. Dołącz raport z uruchomienia do pull requesta jako jego pakiet dowodów.
  3. Zdefiniowana linia „nic nie znaleziono”. NO FINDINGS pozwala skrzynce albo zadaniu CI odróżnić czyste uruchomienie od zepsutego. Pusty albo ucięty raport to awaria, nie sukces.
  4. Comiesięczny kanarek. Podłóż jedną znaną usterkę na roboczej gałęzi (nieobsłużony promise, linię debugger) i uruchom na niej automatyzację. Jeśli jej nie wychwyci, przestała działać, choć każde uruchomienie wygląda na zielone.

Ustalenia przegląda właściciel automatyzacji, zwykle programista, który ją zaplanował; każdą zmianę zatwierdza recenzent pull requesta, dokładnie jak przy pracy człowieka. Szersze uzasadnienie takiego sposobu przeglądu znajdziesz w tekście dowody zamiast diffów.

Przenieś wspólne zadania do harmonogramu CI. Ten workflow uruchamia codzienny prompt kontroli jakości w dni robocze rano z profilem uprawnień tylko do odczytu i zakłada zgłoszenie (issue) tylko wtedy, gdy jest co zgłosić. Wyzwalacz schedule zawsze uruchamia plik workflow i prompt z domyślnej gałęzi, więc do zadania, które ma klucz API, nie trafia żaden niezaufany kod.

Zapisz prompt codziennej kontroli jakości jako .github/codex/daily-quality.md, a potem dodaj .github/workflows/codex-daily-quality.yml:

name: Codex daily quality report
on:
schedule:
- cron: "17 5 * * 1-5" # 05:17 UTC, Monday to Friday
workflow_dispatch:
jobs:
report:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
report: ${{ steps.codex.outputs.final-message }}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 50
persist-credentials: false
# Install dependencies before Codex runs: the read-only profile has no network.
- run: npm ci
- name: Run Codex
id: codex
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
permission-profile: ":read-only"
prompt-file: .github/codex/daily-quality.md
file-issue:
needs: report
if: needs.report.outputs.report != '' && !contains(needs.report.outputs.report, 'NO FINDINGS')
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/github-script@v9
env:
REPORT: ${{ needs.report.outputs.report }}
with:
script: |
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Codex daily quality report ${new Date().toISOString().slice(0, 10)}`,
body: process.env.REPORT,
});
missing-report:
needs: report
if: needs.report.outputs.report == ''
runs-on: ubuntu-latest
permissions: {}
steps:
- run: |
echo "::error::Codex returned no final message. Treat this run as failed."
exit 1

Zadanie z Codeksem może czytać repozytorium i nic poza nim; zgłoszenia może zakładać tylko zadanie file-issue, które Codeksa nigdy nie uruchamia. Zadanie missing-report stosuje zasadę 3 z sekcji o weryfikacji: pusta wiadomość końcowa zmienia uruchomienie na czerwone, zamiast udawać spokojny dzień. Wejścia akcji (permission-profile, prompt-file, wyjście final-message) pochodzą z README openai/codex-action w wersji v1.12. Ponieważ checkout jest na domyślnej gałęzi, zastąp krok 1 promptu tekstem „Inspect the current checkout”. Więcej wzorców znajdziesz w tekście CI/CD z akcją GitHub Codex.

Harmonogram powtarza małe zadanie. Cel realizuje jeden duży zamiar aż do końca. W Codeksie /goal ustawia, edytuje, wstrzymuje, wznawia, pokazuje lub czyści cel zadania (strona OpenAI z poleceniami dla programistów, sprawdzone 2026-08-28); cele są funkcją stabilną i domyślnie włączoną w CLI 0.157.1. Użyj /goal do „każde TODO w src/billing/ jest rozwiązane”, a automatyzacji do „codziennie rano powiedz mi, które nowe TODO się pojawiły”. Przewodnik po /goal porównuje polecenia celu w różnych narzędziach.

Co psuje się, gdy automatyzacje Codex działają bez nadzoru?

Dział zatytułowany „Co psuje się, gdy automatyzacje Codex działają bez nadzoru?”

Uruchomienie w ogóle nie wystartowało. Lokalna automatyzacja wymaga uruchomionej aplikacji desktopowej i komputera, który nie śpi. Naprawa: nie usypiaj maszyny przy zadaniach nocnych albo przenieś zadanie do opisanego wyżej harmonogramu CI, który nie zależy od twojego laptopa.

Codziennie pojawiają się te same ustalenia. Ostrzeżenie lintera, którego nikt nie naprawia, jest zgłaszane w nieskończoność, a skrzynka uczy cię je ignorować. Naprawa: trzymaj w repozytorium plik .automation-ignore.json, który ludzie edytują, akceptując znane ustalenia, i każ promptowi pomijać wszystko, co na nim jest. Do działań następczych, które muszą pamiętać poprzednie uruchomienie, użyj automatyzacji wątku. Pamięć Codex (memories) jest stabilna, ale w 0.157.1 domyślnie wyłączona, więc nie polegaj na niej przy ciągłości.

Minimalny plik wyjątków to lista zaakceptowanych ustaleń, każde z powodem akceptacji:

[
{ "file": "src/legacy/api.ts", "rule": "no-console", "reason": "accepted 2026-09, removed with the legacy API" }
]

Ludzie zmieniają ten plik przez pull request, nigdy automatyzacja, więc każde zaakceptowane ustalenie ma recenzenta i datę.

Stan zapisany w worktree znika. Nie zakładaj, że kolejne uruchomienie w worktree zobaczy pliki zapisane tam wcześniej: niezacommitowany plik „widzianych ustaleń” może następnym razem nie istnieć, na przykład po zarchiwizowaniu uruchomienia albo usunięciu jego worktree. Naprawa: stan, który ma przetrwać, trzymaj w pliku w repozytorium aktualizowanym przez człowieka albo w automatyzacji wątku.

Raporty są długie i mgliste. Prompt jest za szeroki albo nie ma kontraktu wyniku. Naprawa: zawęź zakres do nazwanych katalogów i okna czasowego, wymagaj polecenia odtwarzającego przy każdym ustaleniu i odrzucaj uruchomienia łamiące kontrakt.

Zadanie zmieniło pliki, których nie powinno. Sandbox jest szerszy, niż zadanie potrzebuje. Naprawa: przenieś zadania raportujące na read-only, zadania edytujące umieść w worktree z workspace-write, a pojedyncze polecenia dopuszczaj regułami. Wyrzuć worktree, zamiast próbować go rozplątywać.

Polecenie kończy się błędem sieci lub uprawnień. Sandbox działa zgodnie z zamierzeniem. Naprawa: dodaj prefix_rule dla tego jednego polecenia, potwierdź je przez codex execpolicy check, zrestartuj aplikację, jeśli reguła nie działa, i uruchom zadanie ręcznie przed następnym planowym uruchomieniem.

Automatyzacja wykonała instrukcje z wiadomości na Slacku albo z opisu PR-a. To prompt injection przez czytane treści. Naprawa: przełącz zadanie na tylko do odczytu, odbierz mu wszystkie niepotrzebne dane logowania i dodaj linię o traktowaniu treści jako danych z promptu briefingu.

Worktree się mnożą. Częste uruchomienia w worktree zostawiają po sobie checkouty. Naprawa: archiwizuj przejrzane uruchomienia, raz w tygodniu sprawdzaj git worktree list i usuwaj nieaktualne checkouty przez git worktree remove <path>, gdy żaden otwarty wątek z nich nie korzysta.

Każde uruchomienie od tygodni mówi NO FINDINGS. Zadanie może być zdrowe albo mogło się po cichu zepsuć (zmieniona nazwa skryptu, przeniesiony katalog). Naprawa: uruchom opisanego wyżej comiesięcznego kanarka.

Koszty rosną. Zadanie co godzinę, które mogłoby działać raz dziennie, zużywa limit bez nowych informacji. Naprawa: ustaw częstotliwość według tego, jak często zmieniają się dane źródłowe, a budżetowanie opisuje zarządzanie kosztami Codex.