Przejdź do głównej zawartości

Inżynieria agentowa w branżach regulowanych

Inżynieria agentowa w branżach regulowanych zachowuje kontrole, które audytorzy już testują (autoryzowane zmiany, niezależne zatwierdzenie, dowody testów, kompletna ścieżka audytu), i zmienia tylko to, kto wytwarza dowody. Agenci piszą zmiany i robią wstępne review; ostatni commit zatwierdza człowiek, który nie jest ani właścicielem, ani autorem zmiany; CI zapisuje wszystko w pakiecie dowodów archiwizowanym przy merge’u.

Audyt wewnętrzny twojego banku zaplanował coroczny przegląd ogólnych kontroli IT (ITGC). W zeszłym roku audytorzy wylosowali 25 zmian i przy każdej znaleźli zgłoszenie, przebieg testów i zatwierdzenie drugiej osoby. W tym roku połowę pull requestów otworzył Claude Code albo Codex, przy części zatwierdzające review pochodzi od bota, a w kilku przypadkach Approve kliknął ten sam inżynier, który wydał agentowi polecenie. Pierwsze pytanie audytora będzie brzmiało: „Kto jest tu drugą osobą?”.

Ta strona jest dla CTO, który musi na to pytanie odpowiedzieć, i dla tech leada, który musi sprawić, żeby odpowiedź była prawdziwa w repozytorium. To inżynierska lektura frameworków kontrolnych, a nie porada prawna ani audytorska: uzgodnij projekt kontroli ze swoim audytorem, zanim się na nim oprzesz.

Dlaczego agent zatwierdzający agenta nie spełnia rozdziału obowiązków

Dział zatytułowany „Dlaczego agent zatwierdzający agenta nie spełnia rozdziału obowiązków”

Rozdział obowiązków istnieje po to, żeby jedna strona nie mogła sama wprowadzić szkodliwej zmiany. Frameworki, według których jesteś audytowany, formułują go w kategoriach osób ponoszących odpowiedzialność:

  • NIST SP 800-53 Rev. 5, AC-5, wymaga wskazania obowiązków do rozdzielenia i zdefiniowania uprawnień dostępu, które ten rozdział wspierają („define system access authorizations to support separation of duties”). CM-5(4) Dual Authorization wyjaśnia, że zmiany w wybranych komponentach „cannot occur unless two qualified individuals approve and implement such changes”, i dodaje, że „the individuals are also accountable for the changes”.
  • PCI DSS v4.0.1, wymaganie 6.2.3.1 (wyciąg z wyszukiwarki), oczekuje, że ręczny przegląd kodu wykonają „individuals other than the originating code author” znający techniki review, a zmiany przed wydaniem zatwierdzi kierownictwo.
  • Dla podmiotów finansowych w UE RTS do DORA-EU o ramach zarządzania ryzykiem ICT, rozporządzenie delegowane Komisji (UE) 2024/1774, art. 17 (wyciąg z wyszukiwarki), wymaga procedur zarządzania zmianą, które zapewniają niezależność funkcji zatwierdzających zmiany od funkcji, które je zlecają i wdrażają.

Agent nie jest osobą ponoszącą odpowiedzialność: agent recenzujący uruchomiony przez tego samego inżyniera to druga opinia, a nie druga osoba. GitHub doszedł do tego samego wniosku w sprawie własnego agenta: rulesety mają teraz domyślnie włączoną opcję „Require an additional approval for unattributed Copilot pull requests” (public preview na 2026-09-26), bo „requiring one approval usually means two people are involved in a change”, a to założenie przestaje działać, gdy agent otwiera pull request pod własną tożsamością aplikacji (GitHub Docs, sprawdzone 2026-09-26).

Wniosek to precyzyjna reguła, a nie zakaz: agenci mogą pisać i recenzować; zatwierdzać może tylko osoba, która nie jest ani właścicielem zmiany, ani jej autorem.

Kto co może zrobić w zmianie napisanej przez agenta?

Dział zatytułowany „Kto co może zrobić w zmianie napisanej przez agenta?”

Przypisz każdy krok do roli i ustal, czy może ją pełnić agent. Ta tabela jest rdzeniem twojego opisu kontroli.

KrokRolaCzy może to zrobić agent?Dowód, który zostaje w potoku
Zlecenie zmianyZlecający (product owner, autor zgłoszenia)Nie: autoryzacja pochodzi od osoby albo z zatwierdzonego backloguZgłoszenie lub specyfikacja w spec.link
Odpowiedzialność za zmianęWłaściciel zmiany: inżynier, który uruchamia agenta i odpowiada za wynikNieprovenance.human_owner w pakiecie dowodów
Napisanie kodu i testówAutorTakTożsamość agenta, wersja narzędzia, model i sesja w provenance
Wstępne reviewAgent recenzujący (/code-review w Claude Code, codex exec review, Bugbot w Cursorze)Tak, jako kontrola, która wytwarza ustaleniaWynik review zarchiwizowany razem z pakietem
Zatwierdzenie zmianyNiezależny zatwierdzającyNie: osoba, która nie jest ani właścicielem zmiany, ani autorem pull requestaZatwierdzające review ostatniego commita, zapisane przez GitHuba
Zatwierdzenie wrażliwych ścieżekCode owner dla uwierzytelniania, płatności, schematu, migracjiNieReview z CODEOWNERS, wymagane przez ruleset
Wdrożenie na produkcjęPotok, z bramką osoby zatwierdzającej wydaniePotok wdraża; bramką jest osoba inna niż ta, która wdrożenie uruchomiłaZapis wdrożenia z zatwierdzeniem środowiska
Zmiana samej bramkiWłaściciel platformyNieCODEOWNERS dla workflowów, polityki i plików checkera

Dwa przypadki brzegowe wymagają spisanej reguły przed audytem, a nie w jego trakcie:

  1. Brak ludzkiego właściciela. Zaplanowane uruchomienie, pętla wyzwalana przez zgłoszenie albo agent uruchomiony ze wspólnego kanału czatu nie mają właściciela. Potraktuj je tak, jak GitHub traktuje nieprzypisane pull requesty Copilota: wymagaj dwóch niezależnych zatwierdzeń przez ludzi.
  2. Właściciel edytuje gałąź agenta. Gdy właściciel wypycha własne commity, staje się także autorem. Ruleset poniżej wymaga zatwierdzenia przez kogoś innego niż osoba, która wypchnęła ostatnie zmiany, więc push właściciela ponownie otwiera zatwierdzanie.

Czego audytorzy w finansach, ochronie zdrowia i sektorze publicznym oczekują od potoku?

Dział zatytułowany „Czego audytorzy w finansach, ochronie zdrowia i sektorze publicznym oczekują od potoku?”

Audytorzy rzadko pytają o samego agenta. Dla próbki zmian produkcyjnych proszą o autoryzację, testy, niezależne zatwierdzenie, zapis wdrożenia i dowód, że żadna zmiana nie ominęła procesu. Sektory różnią się słownictwem i okresem przechowywania. Raz przypisz każde oczekiwanie do artefaktu potoku, a audyt sprowadzi się do zapytania.

Sektor i frameworkCo testuje audytorGdzie odpowiada na to twój potok agentów
Finanse, spółki notowane w USA: ogólne kontrole IT SOX dla zmian w programachKażda wylosowana zmiana autoryzowana, przetestowana i zatwierdzona przez kogoś innego niż jej autor, który nie może sam przenieść jej na produkcjęspec.link; acceptance i checks w pakiecie; check sod; środowisko produkcyjne z zablokowanym samozatwierdzaniem
Finanse, UE: DORA-EU art. 9 ust. 4 lit. e i RTS 2024/1774 art. 17 (zob. CRA, NIS2 i DORA-EU)Udokumentowane, oparte na ryzyku zarządzanie zmianą; niezależność funkcji zatwierdzających i wdrażającychKlasa ryzyka w pakiecie; routing CODEOWNERS dla ścieżek wysokiego ryzyka; ruleset bez wyjątków (bypass)
Płatności kartowe: PCI DSS v4.0.1, wym. 6.2.3, 6.2.3.1, 6.5.1, 6.5.4Kod tworzony na zamówienie przejrzany przed wydaniem przez kogoś innego niż autor; zmiany udokumentowane z zatwierdzeniem, testami i planem wycofania; rozdzielone role produkcyjneUstalenia agenta recenzującego plus niezależne zatwierdzenie człowieka; risk.rollback; zatwierdzenie wdrożenia przez osobę, która go nie uruchomiła
Ochrona zdrowia, USA: kontrole audytowe HIPAA Security Rule (45 CFR 164.312(b)); FDA 21 CFR Part 11 §11.10(e) dla systemów GxPAktywność w systemach z chronionymi lub regulowanymi danymi jest rejestrowana; ścieżki audytu są generowane komputerowo, opatrzone znacznikiem czasu i nie zacierają wcześniejszych wpisówTelemetria agentów w twoim SIEM; podpisane archiwum dowodów; dane PHI trzymane poza kontekstem agenta (zob. prywatność danych)
Sektor publiczny, administracja federalna USA: NIST SP 800-53 Rev. 5 (podstawa baseline’ów FedRAMP) CM-3, CM-4, CM-5(4), AC-5, AU-10, SA-10Zmiany przeglądane z analizą wpływu na bezpieczeństwo, przechowywane zapisy zmian, podwójna autoryzacja tam, gdzie ją wybrano, niezaprzeczalność zatwierdzeńSekcja ryzyka w pakiecie; zarchiwizowane zatwierdzenia powiązane z imiennymi kontami; podpisana atestacja archiwum

Kontrola zmian oprogramowania wyrobów medycznych według IEC 62304 i środki bezpieczeństwa NIS2 w unijnym sektorze publicznym korzystają z tych samych artefaktów: spec.link, spec.delta i acceptance dają śledzalność, oracle_changes pokazuje, czy weryfikacji nie osłabiono, a obowiązki opisuje strona CRA, NIS2 i DORA-EU. Jeśli certyfikujesz też system zarządzania AI albo przygotowujesz raporty SOC 2, te same artefakty obsłużą i te audyty; mapowanie kontrola po kontroli znajdziesz na stronie ISO/IEC 42001, NIST AI RMF i dowody SOC 2.

Dodaj cztery kontrole w tej kolejności, bo checki muszą istnieć, zanim ruleset zacznie ich wymagać. Kroki zakładają GitHuba i pakiet dowodów, którego job w CI nazywa się evidence.

  1. Daj każdemu agentowi własną tożsamość. Agent na osobistym tokenie programisty sprawia, że autor i właściciel to to samo konto. Uruchamiaj agentów w CI jako GitHub App albo dedykowane konto maszynowe z krótkotrwałymi tokenami, tak jak opisuje strona tożsamość agentów, poświadczenia i sekrety. Zostaw wyłączone ustawienie Allow GitHub Actions to create and approve pull requests (Settings, Actions, General, Workflow permissions), chyba że jakiś workflow musi otwierać pull requesty, i nigdy nie pozwalaj tokenowi workflowu ich zatwierdzać.

  2. Dodaj check rozdziału obowiązków. Przechodzi tylko wtedy, gdy bieżący commit HEAD zatwierdziła osoba z twojej listy zatwierdzających, która nie jest właścicielem zmiany, autorem pull requesta, osobą kiedykolwiek do niego przypisaną ani autorem czy committerem żadnego commita na gałęzi. Gdy zmiana nie ma ludzkiego właściciela, potrzebne są dwie takie osoby. Uruchamia się ponownie przy każdym dodaniu lub odrzuceniu review.

    .github/workflows/sod.yml
    name: separation-of-duties
    on:
    pull_request:
    types: [opened, edited, synchronize, reopened, ready_for_review]
    pull_request_review:
    types: [submitted, dismissed]
    permissions:
    contents: read
    issues: read
    pull-requests: read
    jobs:
    sod:
    runs-on: ubuntu-latest
    steps:
    - name: Require an independent human approval of the head commit
    env:
    GH_TOKEN: ${{ github.token }}
    REPO: ${{ github.repository }}
    PR: ${{ github.event.pull_request.number }}
    run: |
    set -euo pipefail
    gh api "repos/$REPO/pulls/$PR" > pr.json
    HEAD_SHA=$(jq -r .head.sha pr.json)
    BASE_SHA=$(jq -r .base.sha pr.json)
    AUTHOR=$(jq -r .user.login pr.json)
    # GitHub reports a machine account as type "User", so the type proves nothing.
    # Approvers come from a CODEOWNERS-protected list read from the base branch.
    # On a 404, gh api still prints GitHub's JSON error body, so test its exit status.
    if ! gh api -H "Accept: application/vnd.github.raw+json" \
    "repos/$REPO/contents/.github/human-approvers?ref=$BASE_SHA" > approvers.raw; then
    echo "::error::.github/human-approvers is missing on the base branch"; exit 1
    fi
    sed -e 's/#.*//' -e 's/^@//' -e 's/[[:space:]]//g' approvers.raw | grep -v '^$' > humans.txt || true
    if [ ! -s humans.txt ]; then
    echo "::error::.github/human-approvers is empty on the base branch"; exit 1
    fi
    owner=$(jq -r '.body // ""' pr.json \
    | sed -nE 's/^[[:space:]]*human_owner:[[:space:]]*"?@?([A-Za-z0-9-]+)"?.*/\1/p' | head -n1)
    if [ -z "$owner" ]; then
    echo "::error::provenance.human_owner is missing (use none for a run without an owner)"; exit 1
    fi
    required=1
    if [ "$owner" = none ]; then required=2
    elif ! jq -e --arg o "$owner" \
    'any(.assignees[]; (.login | ascii_downcase) == ($o | ascii_downcase))' pr.json >/dev/null; then
    echo "::error::human_owner ($owner) must be an assignee of the pull request"; exit 1
    fi
    # human_owner sits in the PR description, which the author can edit, so
    # every commit author, committer and anyone ever assigned is excluded too.
    gh api "repos/$REPO/pulls/$PR/commits" --paginate \
    --jq '.[] | .author.login?, .committer.login? | select(. != null)' > committers.txt
    gh api "repos/$REPO/issues/$PR/events" --paginate \
    --jq '.[] | select(.event == "assigned") | .assignee.login' >> committers.txt
    printf '%s\n%s\n' "$owner" "$AUTHOR" >> committers.txt
    gh api "repos/$REPO/pulls/$PR/reviews" --paginate > reviews.json
    approvers=$(jq -r --arg sha "$HEAD_SHA" '.[]
    | select(.state == "APPROVED" and .commit_id == $sha and .user.type == "User")
    | .user.login' reviews.json | sort -u)
    independent=$(printf '%s\n' "$approvers" | grep -x -i -F -f humans.txt \
    | grep -v -x -i -F -f committers.txt | grep -v '^$' || true)
    count=$(printf '%s\n' "$independent" | grep -c . || true)
    if [ "$count" -lt "$required" ]; then
    echo "::error::$HEAD_SHA needs $required approval(s) from listed humans other than the owner ($owner), the author (@$AUTHOR) or a committer; found $count"; exit 1
    fi
    echo "Independent approval of $HEAD_SHA by: $(echo $independent)"

    Check pomija zatwierdzenia starszych commitów oraz zatwierdzenia z każdego konta, którego nie ma w pliku .github/human-approvers (jeden login w wierszu). Plik jest czytany z gałęzi bazowej, więc pull request nie dopisze sobie zatwierdzającego. Sam typ konta nie wystarcza: GitHub zgłasza konto maszynowe, czyli zwykłe konto, na które loguje się agent, jako typ User, a jako Bot pokazuje tylko aplikacje GitHub. Wpisuj ludzi, nigdy kont serwisowych. Brak pliku albo pusty plik oznacza błąd checka. Pole human_owner kontroluje autor: autor albo właściciel może je przepisać, a wyzwalacz edited ponownie uruchamia check. Dlatego właściciel musi być też przypisany (assignee) do pull requesta, a check wyklucza każdego, kto kiedykolwiek był przypisany, oraz wszystkich autorów i committerów commitów. Przypisz właściciela zmiany, gdy agent otwiera pull request. Właściciel nadal deklaruje się sam: jeśli nie jest przypisany, może wpisać kolegę, który jest przypisany, a potem zatwierdzić zmianę. Dlatego bierz właściciela ze źródła, którego autor nie może edytować, na przykład z dziennika sesji agenta albo z aktora uruchamiającego zapisanego przez aplikację agenta, i niech zadanie archiwizujące oraz twój test kontroli porównują z nim human_owner. Dla uruchomienia bez ludzkiego właściciela, na przykład zaplanowanego albo wyzwalanego przez zgłoszenie, wpisz human_owner: none: check wymaga wtedy dwóch różnych niezależnych osób, które zatwierdziły commit HEAD. Ruleset tego za ciebie nie zrobi, bo jego liczba zatwierdzeń dotyczy każdego pull requesta na gałęzi.

  3. Utwórz ruleset gałęzi. Wymaga jednego zatwierdzenia, review code ownera i zatwierdzenia ostatniego pusha przez kogoś innego niż jego autor; odrzuca nieaktualne zatwierdzenia i wymaga trzech checków: evidence, sod i agent-review, czyli joba recenzującego opisanego niżej w zakładkach narzędzi. Dzięki wymaganemu agent-review pull requesta nie da się scalić, zanim review jego commita HEAD zakończy się sukcesem, więc zadanie archiwizujące znajdzie wynik recenzji. Pusta lista wyjątków (bypass) pozwala powiedzieć audytorowi, że populacja jest kompletna. Każdy check jest przypięty do integration_id 15368, czyli aplikacji GitHub Actions: nieprzypięty wymagany check przyjmuje status o tej nazwie od każdego konta, które może zapisywać statusy commitów, także od GitHub App albo tokena samego agenta, który mógłby sam oznaczyć sod jako zaliczony.

    {
    "name": "regulated-default-branch",
    "target": "branch",
    "enforcement": "active",
    "bypass_actors": [],
    "conditions": { "ref_name": { "include": ["~DEFAULT_BRANCH"], "exclude": [] } },
    "rules": [
    { "type": "deletion" },
    { "type": "non_fast_forward" },
    { "type": "pull_request", "parameters": {
    "required_approving_review_count": 1,
    "dismiss_stale_reviews_on_push": true,
    "require_code_owner_review": true,
    "require_last_push_approval": true,
    "required_review_thread_resolution": true } },
    { "type": "required_status_checks", "parameters": {
    "strict_required_status_checks_policy": true,
    "required_status_checks": [
    { "context": "evidence", "integration_id": 15368 },
    { "context": "sod", "integration_id": 15368 },
    { "context": "agent-review", "integration_id": 15368 } ] } }
    ]
    }
    Okno terminala
    # Terminal, jako administrator repozytorium
    gh api -X POST repos/acme/payments-api/rulesets --input ruleset.json
  4. Uzależnij wdrożenie produkcyjne od drugiej osoby. Utwórz środowisko production z osobami zatwierdzającymi wydania jako wymaganymi recenzentami i zablokowanym samozatwierdzaniem. Na planach GitHub Free, Pro i Team wymagani recenzenci działają tylko w repozytoriach publicznych, więc prywatny kod regulowany potrzebuje do tego kroku GitHub Enterprise.

    Okno terminala
    # Terminal, jako administrator repozytorium. 4532992 to numeryczny id zespołu
    # release-approvers: gh api orgs/acme/teams/release-approvers --jq .id
    gh api -X PUT repos/acme/payments-api/environments/production --input - <<'JSON'
    { "prevent_self_review": true,
    "reviewers": [ { "type": "Team", "id": 4532992 } ] }
    JSON

Skąd wiesz, że check rozdziału obowiązków działa?

Dział zatytułowany „Skąd wiesz, że check rozdziału obowiązków działa?”

Testuj go jak każdą wyrocznię: przypadkami, które muszą się nie udać. Na tymczasowym pull requeście z tożsamości agenta każdy przypadek oprócz ostatniego musi zostawić sod na czerwono albo zablokowany merge.

PrzypadekOczekiwany wynik
Pakiet bez human_ownerBłąd: brak właściciela
Zatwierdza tylko właściciel zmianyBłąd: brak niezależnego zatwierdzenia
Zatwierdza bot recenzującyBłąd: zatwierdzenia z kont Bot są pomijane
Zatwierdza konto maszynowe (typ User), na które loguje się agentBłąd: nie ma go w .github/human-approvers
human_owner zmieniony na inne nazwisko, potem zatwierdza prawdziwy właścicielBłąd, gdy agent przypisał właściciela przy tworzeniu pull requesta: właściciel jest przypisany, więc check go wyklucza
Konto agenta publikuje status success o nazwie sodNadal zablokowane: ruleset przyjmuje sod tylko od GitHub Actions
human_owner: none i commit HEAD zatwierdza jedna niezależna osobaBłąd, dopóki nie zatwierdzi go druga niezależna osoba
Niezależna osoba zatwierdza, a potem agent wypycha kolejny commitBłąd, dopóki ta sama lub inna osoba nie zatwierdzi nowego commita HEAD
Próba merge’a, zanim uruchomienie agent-review na commicie HEAD zakończy się sukcesemZablokowane: agent-review jest wymaganym checkiem
Niezależna osoba zatwierdza commit HEADSukces

Zapisz linki do tych uruchomień w pliku testowania kontroli: audytor ufa kontroli, którą potrafisz na żądanie pokazać w stanie błędu.

Pull request da się edytować: każdy z uprawnieniami zapisu może po merge’u zmienić opis, a więc i pakiet. Artefakty Actions wygasają. Zrób migawkę zapisu w chwili merge’a, podpisz ją za pomocą actions/attest i skopiuj do magazynu, którym zarządza twoja polityka retencji.

.github/workflows/archive-evidence.yml
name: archive-evidence
on:
pull_request:
types: [closed]
jobs:
archive:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
checks: read
actions: read
id-token: write
attestations: write
artifact-metadata: write
steps:
- name: Snapshot the bundle, reviews, comments, check runs and reviewer output
id: snapshot
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
PR: ${{ github.event.pull_request.number }}
SHA: ${{ github.event.pull_request.head.sha }}
# The workflow that runs the reviewer agent and uploads evidence/
# as the artifact "agent-review"
REVIEW_WORKFLOW: agent-review.yml
run: |
set -euo pipefail
D="evidence-$PR"; mkdir -p "$D"
gh api "repos/$REPO/pulls/$PR" > "$D/pull-request.json"
gh api "repos/$REPO/pulls/$PR/reviews" --paginate --slurp > "$D/reviews.json"
gh api "repos/$REPO/pulls/$PR/comments" --paginate --slurp > "$D/review-comments.json"
gh api "repos/$REPO/issues/$PR/comments" --paginate --slurp > "$D/issue-comments.json"
gh api "repos/$REPO/commits/$SHA/check-runs" --paginate --slurp > "$D/check-runs.json"
# A missing reviewer output must not cost the rest of the record: archive
# the snapshot, record the gap as an exception, fail the job after upload.
run_id=$(gh run list -R "$REPO" --workflow "$REVIEW_WORKFLOW" --commit "$SHA" \
--status success --limit 1 --json databaseId --jq '.[0].databaseId // empty' || true)
if [ -n "$run_id" ] && gh run download "$run_id" -R "$REPO" -n agent-review -D "$D/agent-review"; then
echo "reviewer_output=present" >> "$GITHUB_OUTPUT"
else
echo "EXCEPTION: no agent-review output from a successful $REVIEW_WORKFLOW run on $SHA at merge" \
> "$D/EXCEPTION-agent-review-missing.txt"
echo "reviewer_output=missing" >> "$GITHUB_OUTPUT"
fi
tar czf "$D.tgz" "$D"
- uses: actions/attest@v4
with:
subject-path: evidence-${{ github.event.pull_request.number }}.tgz
- uses: actions/upload-artifact@v7
with:
name: evidence-${{ github.event.pull_request.number }}
path: evidence-${{ github.event.pull_request.number }}.tgz
- name: Fail when the reviewer output is missing
if: steps.snapshot.outputs.reviewer_output == 'missing'
env:
SHA: ${{ github.event.pull_request.head.sha }}
run: |
echo "::error::no agent-review output for $SHA; the archive records it as a control exception"
exit 1

Migawka obejmuje pull request, jego review, komentarze w kodzie, komentarze w rozmowie, uruchomienia checków i wynik agenta recenzującego z artefaktu agent-review. Jeśli tego wyniku brakuje, job i tak archiwizuje i atestuje całą resztę, dodaje do archiwum plik EXCEPTION-agent-review-missing.txt, a dopiero potem kończy się błędem. Luka jest więc widoczna jako czerwone uruchomienie i zapisany wyjątek, a zapis nie przepada. Atestacja wiąże skrót archiwum z uruchomieniem workflowu, które je wytworzyło, a gh attestation verify to sprawdza. Dodaj ostatni krok, który kopiuje archiwum do magazynu jednokrotnego zapisu, na przykład bucketu z blokadą obiektów, z okresem retencji wymaganym przez regulatora. Atestacje artefaktów w repozytoriach prywatnych wymagają GitHub Enterprise Cloud.

Jak w tę kontrolę wpisują się Claude Code, Codex i Cursor?

Dział zatytułowany „Jak w tę kontrolę wpisują się Claude Code, Codex i Cursor?”

Ruleset, checki i archiwum są takie same dla każdego narzędzia. Różnią się przypinanie wersji, wynik recenzji i dziennik aktywności.

Kontrola wersji narzędzia. Claude Code ma dwa kanały wydań: latest (2.1.283 na 2026-09-26) i stable (2.1.274), który jest „typically about a week behind” i pomija wydania z poważnymi regresjami. Ustaw autoUpdatesChannel: "stable" w ustawieniach zarządzanych i zapisuj wersję w provenance.agent. Kanał dotyczy tylko stacji roboczych: w CI instaluj przypiętą wersję (npm install -g @anthropic-ai/claude-code@2.1.283 albo stable 2.1.274) i zapisuj claude --version w provenance.agent. Najnowsze zmiany docierają do stable później; domyślny model dla każdego kanału podaje centrum modeli.

Wynik recenzji jako dowód. Uruchom review w trybie headless i zachowaj wynik JSON obok pakietu:

Okno terminala
# Job CI na pull requeście (Claude Code 2.1.283). Pobierz repozytorium
# z fetch-depth: 0 albo uruchom git fetch origin main, żeby istniał origin/main.
mkdir -p evidence
claude -p "Review the diff against origin/main for security and correctness. List findings with file:line." \
--bare --setting-sources "" --strict-mcp-config \
--output-format json --permission-mode dontAsk \
--allowedTools "Read,Grep,Glob,Bash(git diff:*)" \
> evidence/claude-review.json

Prompt stoi zaraz po -p, bo --allowedTools przyjmuje listę o zmiennej długości i połknąłby prompt umieszczony za nią. --bare pomija hooki i wyszukiwanie plików CLAUDE.md, --setting-sources "" nie ładuje żadnego pliku ustawień, więc ustawienia projektu i lokalne z gałęzi kontrolowanej przez autora zostają pominięte, a --strict-mcp-config ignoruje jej serwery MCP. Z --bare skille nadal da się wywołać przez /nazwa-skilla, więc prompt żadnego nie wywołuje. Z --bare job uwierzytelnia się wyłącznie przez ANTHROPIC_API_KEY (albo poświadczenia dostawcy chmury); token OAuth nie jest odczytywany. Uruchamiaj go na pull_request z contents: read i checkoutem z persist-credentials: false, nigdy na pull_request_target. Nazwij workflow agent-review.yml, a jego job agent-review, bo tego checka wymaga ruleset, i zakończ job krokiem actions/upload-artifact, który wysyła katalog evidence/ jako agent-review; zadanie archiwizujące pobierze go przy merge’u.

Dziennik aktywności. Ustaw CLAUDE_CODE_ENABLE_TELEMETRY=1 i standardowe zmienne eksportera OTEL_* w ustawieniach zarządzanych, żeby programiści nie mogli ich wyłączyć. Compliance API jest funkcją planu Enterprise.

We wszystkich trzech narzędziach nie wpuszczaj danych regulowanych do kontekstu agenta: jeśli prompt zawierał dane pacjenta albo posiadacza karty, zawierają je też dzienniki sesji i archiwum. Kieruj ruch do modeli tak, jak opisuje strona gdzie działa model, i stosuj klasy danych ze strony prywatność danych i polityki firmowe.

Te prompty czytają dowody; żaden niczego nie zatwierdza. Uruchamiaj je z uprawnieniami tylko do odczytu.

Audytorzy testują skuteczność działania w całym okresie, więc co kwartał wpisuj te trzy liczby do pliku testowania kontroli:

MetrykaDefinicjaCel
Kompletność pakietówScalone pull requesty do repozytoriów w zakresie z zarchiwizowanym pakietem i przechodzącym checkiem evidence na commicie HEAD, podzielone przez wszystkie scalone pull requesty do tych repozytoriów, liczone z historii gałęzi domyślnej albo listy scalonych pull requestów (gh api), a nie z archiwów100%; każdy wyjątek ma zgłoszenie
Odsetek niezależnych zatwierdzeńScalone pull requesty, których archiwum pokazuje zatwierdzenie commita HEAD przez człowieka innego niż właściciel i autor, podzielone przez wszystkie scalone pull requesty100%
Terminowo zatwierdzone zmiany awaryjneZmiany awaryjne z retrospektywnym niezależnym zatwierdzeniem w oknie określonym przez twoją politykę, podzielone przez wszystkie zmiany awaryjne100%

Mianownik bierz z historii gałęzi domyślnej albo z gh api repos/acme/payments-api/pulls?state=closed przefiltrowanego do scalonych pull requestów i porównuj go z listą archiwów: merge, dla którego zadanie archiwizujące się nie uruchomiło, nie ma archiwum, więc wskaźnik liczony tylko z archiwów zawsze pokazuje 100%. Liczniki bierz z archiwów. Change failure rate i lead time definiuje strona frameworki metryk.

Co się psuje w regulowanych potokach agentów i jak to naprawić?

Dział zatytułowany „Co się psuje w regulowanych potokach agentów i jak to naprawić?”
AwariaJak się objawiaJak naprawić
Właściciel zatwierdza pracę agenta, bo autorem jest bot.Wylosowane zmiany, w których zatwierdzający to human_owner.Zapisz każdą jako wyjątek kontrolny, uzyskaj retrospektywne niezależne zatwierdzenie i ustaw sod jako wymagany check.
Bot recenzujący liczy się jako zatwierdzenie. Token workflowu, konto aplikacji albo konto maszynowe wysyła zatwierdzające review.Zatwierdzenia z kont typu Bot albo spoza .github/human-approvers; włączone ustawienie Allow GitHub Actions to create and approve pull requests.Wyłącz to ustawienie na poziomie organizacji, odbierz aplikacjom agentów prawo zatwierdzania i uruchom ponownie prompt o lukach.
Zatwierdzenie starszego commita. Agent wypchnął poprawkę po zatwierdzeniu.commit_id zatwierdzającego review różni się od scalonego HEAD.Włącz dismiss_stale_reviews_on_push i require_last_push_approval; check sod już porównuje commit.
Dowody edytowane po merge’u. Ktoś po miesiącach „porządkuje” pakiet.Bieżący pull request nie zgadza się z archiwum.Zapisem jest podpisane archiwum, a nie bieżąca strona. Zweryfikuj je gh attestation verify i odnotuj edycję.
Bypass użyty przy hotfiksie i nigdy nie uregulowany. Administrator scalił zmianę bezpośrednio podczas incydentu.Zdarzenia bypass w rulesecie albo zmiana produkcyjna bez pull requesta.Spisz ścieżkę awaryjną: imienną rolę break-glass, pull request po fakcie i retrospektywne niezależne zatwierdzenie w oknie polityki. Zobacz gdy incydent wywoła agent.
Zadanie archiwizujące nie zadziałało przy merge’u. Błąd API GitHuba albo awaria runnera zatrzymały archive-evidence albo zabrakło wyniku recenzji.Scalony pull request z czerwonym lub brakującym uruchomieniem archive-evidence albo archiwum z plikiem EXCEPTION-agent-review-missing.txt.Od razu uruchom job ponownie i zapisz wyjątek kontrolny: spóźniona migawka czyta bieżący pull request, który może edytować każdy z uprawnieniami zapisu, więc porównaj opis z historią jego edycji i odnotuj każdą zmianę po merge’u. Gdy brakuje wyniku recenzji, najpierw uruchom ponownie agent-review dla scalonego commita HEAD, potem zadanie archiwizujące.
Agent osłabił test, który dowodzi zmiany.oracle_changes z kierunkiem looser albo niezadeklarowana edycja testu.Pakiet podnosi zmianę do ryzyka high i wymusza review code ownera. Pliki wyroczni powinny należeć do ludzi, jak opisuje strona ochrona wyroczni.

Najczęstsze pytania

Czy jeden agent AI może zatwierdzić zmianę napisaną przez innego agenta?

Nie na potrzeby rozdziału obowiązków. Review agenta to kontrola, która wytwarza dowody, ale frameworki, według których audytor testuje, mówią o osobach ponoszących odpowiedzialność: zatwierdzający nie może być ani autorem, ani właścicielem zmiany. Zostaw review agenta i dodaj zatwierdzenie ostatniego commita przez człowieka.

Kto jest autorem zmiany napisanej przez agenta z punktu widzenia audytu?

Człowiek, który odpowiada za zadanie i uruchomił agenta, zapisany w pakiecie dowodów jako właściciel zmiany. Ta osoba nie może zmiany zatwierdzić. Gdy właściciela nie ma, na przykład przy zaplanowanym uruchomieniu agenta, wymagaj dwóch zatwierdzeń przez ludzi.

Co sprawdza audytor, gdy kod piszą agenci?

To samo co wcześniej: autoryzację zmiany, dowody testów, niezależne zatwierdzenie przed produkcją, zapis wdrożenia i dowód, że żadna zmiana nie trafiła na produkcję poza procesem. Pakiet dowodów, reguły gałęzi i zatwierdzenia wdrożeń dostarczają każdy z tych elementów dla każdego pull requesta.