
예전에는 Git Commit을 보면 대체로 질문이 단순했다.
누가 작성했는가?
언제 변경했는가?
왜 변경했는가?
그래서 Git에는 이미 필요한 정보가 상당 부분 들어 있다.
Author
Committer
Timestamp
Commit Message
Diff
Pull Request
Reviewer
그런데 Coding Agent가 본격적으로 개발 Workflow 안으로 들어오면서 이 정보만으로는 부족해지기 시작했다.
예를 들어 이런 Commit이 있다고 하자.
Fix race condition in session refresh
작성자는:
developer@company.com
이다.
하지만 실제 과정은 이랬을 수도 있다.
Developer
↓
Claude Code
↓
Subagent 3개가 원인 조사
↓
Claude Code가 코드 수정
↓
Agent가 Test 생성
↓
Agent가 Build 실행
↓
Developer가 Diff 확인
↓
Commit
Git에는 최종적으로 사람 이름만 남아 있다.
그러면 몇 달 뒤 이 코드를 보는 사람은 알 수 없다.
이 코드는 사람이 직접 작성했는가?
AI가 대부분 작성했는가?
어떤 Agent가 작성했는가?
어떤 모델을 사용했는가?
어떤 Prompt에서 시작됐는가?
Agent가 어떤 Tool을 실행했는가?
Test는 실제로 실행했는가?
사람은 어디까지 검토했는가?
Coding Agent가 단순 자동완성 수준일 때는 크게 중요하지 않았다.
하지만 Agent가:
Repository 조사
Architecture 판단
코드 수정
Test 작성
Shell 실행
Dependency 변경
PR 생성
까지 수행하기 시작하면 이야기가 달라진다.
이제 Source Code에도 Provenance, 즉 “이 변경이 어디에서 어떤 과정으로 만들어졌는가”에 대한 정보가 필요해진다.
Provenance 자체는 AI 때문에 새로 생긴 개념이 아니다.
SLSA에서는 Provenance를 Software Artifact가 어디서, 언제, 어떤 방식으로 만들어졌는지를 추적할 수 있는 검증 가능한 정보로 정의한다. 현재 SLSA 1.2에서는 Build Provenance뿐 아니라 Source Provenance도 별도 Track으로 다루고 있다.
Build Artifact라면 이런 질문에 답한다.
어떤 Source에서 빌드됐는가?
어떤 Builder가 만들었는가?
어떤 Build Definition을 사용했는가?
어떤 Input이 들어갔는가?
SLSA Build Provenance의 목적 역시 Artifact가 예상된 방식으로 만들어졌는지 검증하고, 필요하다면 재현할 수 있도록 하는 것이다.
이 개념을 Coding Agent에 가져오면 질문이 조금 바뀐다.
어떤 Agent가 변경했는가?
누가 Agent를 시작했는가?
어떤 Repository 상태에서 실행됐는가?
Agent가 어떤 Policy 아래서 작업했는가?
무슨 검증을 통과했는가?
사람은 어디에서 승인했는가?
이것을 Agent Provenance라고 생각할 수 있다.
기존 Git에서는 보통 다음 정도면 충분했다.
Author:
Kim Developer
Commit:
a81f3ce
하지만 AI Agent 시대에는 Author와 실제 생성 주체가 다를 수 있다.
예를 들어:
Human Initiator
│
▼
Coding Agent
│
▼
Generated Patch
│
▼
Human Review
│
▼
Commit
이 경우 Commit Author를 누구로 해야 할까?
사람?
Agent?
둘 다?
정답은 프로젝트 정책에 따라 달라질 수 있지만 중요한 것은 정보를 잃어버리지 않는 것이다.
GitHub는 이 문제를 이미 일부 해결하기 시작했다.
2026년 3월부터 GitHub Copilot Coding Agent가 만든 Commit은 Copilot이 Author가 되고, 작업을 시작한 사람은 Co-author로 기록된다. 여기에 Agent-Logs-Url Commit Trailer를 추가해 해당 Commit에서 실제 Agent Session Log까지 추적할 수 있게 했다.
즉:
Commit
↓
Agent
↓
Human Initiator
↓
Agent Session
연결이 생긴 것이다.
기존:
Commit
↓
Diff
Agent 시대:
Commit
│
├─ Diff
├─ Agent Identity
├─ Human Initiator
├─ Session
├─ Validation
├─ Policy
└─ Evidence
가 될 가능성이 높다.
Commit만 읽으면 모든 내용을 다 보여줄 필요는 없다.
대신 Provenance Record로 연결할 수 있으면 된다.
예:
commit a81f3ce
Agent: claude-code
Agent-Session: sess_9d71
Initiated-By: kim@company.com
Validation: agent-validation-182
Provenance: provenance/a81f3ce.json
이런 식이다.
처음에는 이렇게 하고 싶어진다.
Generated by Claude Code
Model: ...
Prompt: ...
Session: ...
Files read: ...
Commands executed: ...
Tests: ...
하지만 Commit Message가 금방 엉망이 된다.
Git Commit에는 Index 역할을 하는 최소 정보만 남기는 것이 낫다.
예:
Fix session refresh race condition
Agent: claude-code
Agent-Session: sess_9d71
Human-Initiator: kim@company.com
Provenance-Id: prov_01892
나머지는 별도 Provenance Object로 저장한다.
최소 구조는 다음 정도면 충분하다.
{
"version": "1",
"commit": "a81f3ce",
"agent": {
"name": "claude-code",
"sessionId": "sess_9d71"
},
"initiator": {
"type": "human",
"id": "kim@company.com"
},
"repository": {
"url": "git@company/mobile-app.git",
"baseRevision": "3a8cd12"
},
"task": {
"id": "MOB-1421",
"type": "bugfix"
},
"validation": {
"build": "passed",
"tests": "passed",
"lint": "passed"
},
"humanReview": {
"required": true,
"status": "approved"
}
}
여기서 중요한 것은 Agent가 작성했다고 주장하는 것과 실제로 검증된 사실을 구분하는 것이다.
Agent가 보고한다.
모든 테스트가 통과했습니다.
이 문장을 Provenance에 그대로 넣으면 안 된다.
좋은 구조는:
Agent Claim
과
Verification Evidence
를 나눈다.
예:
{
"validation": {
"tests": {
"status": "passed",
"command": "./gradlew test",
"exitCode": 0,
"runner": "ci-runner-182",
"artifact": "test-results-182"
}
}
}
즉:
Agent의 말
X
실행 결과
O
가 Source of Truth가 되어야 한다.
처음에는 다음에 집중하기 쉽다.
Claude가 만들었나?
Codex가 만들었나?
Copilot이 만들었나?
하지만 실제 Audit에서는 이것보다 더 중요한 정보가 있다.
누가 실행했는가?
어떤 Repository Revision에서 시작했는가?
어떤 권한을 가지고 있었는가?
어떤 Policy를 적용했는가?
어떤 검증을 통과했는가?
사람이 승인했는가?
Agent Vendor는 바뀔 수 있다.
하지만 Execution Context는 계속 중요하다.
예:
{
"agent": {
"product": "claude-code"
},
"runtime": {
"environment": "self-hosted",
"runner": "agent-runner-42",
"sandbox": "sandbox-921",
"policy": "coding-agent-v12"
}
}
지난 글에서 다룬 Self-hosted Coding Agent Runtime과 연결되는 지점이다.
Agent가:
어디에서 실행됐는가
도 Provenance의 일부가 된다.
다음처럼 남길 수도 있다.
{
"model": {
"provider": "anthropic",
"family": "claude"
}
}
하지만 Model ID를 무조건 Audit의 핵심으로 삼는 것은 조심해야 한다.
서비스에 따라 내부 Routing이 바뀔 수도 있고, 특정 Agent 제품이 Model을 자동 선택할 수도 있다.
따라서 Provenance Schema를:
agentProduct
agentVersion
model
runtime
policy
로 분리하는 편이 좋다.
Model 정보가 제공되는 경우 기록하고, 그렇지 않은 경우 억지로 추정하지 않는다.
여기서도 고민이 생긴다.
Agent가 작업한 Prompt를 그대로 저장하면 재현성은 좋아질 수 있다.
하지만 Prompt 안에는:
고객 정보
Internal URL
Secret
Security Issue
미공개 Feature
개발자 개인 정보
가 포함될 수 있다.
그래서 Provenance에 Raw Prompt를 넣는 것은 권장하기 어렵다.
대신:
{
"task": {
"id": "MOB-1421",
"summary": "Fix session refresh race condition"
},
"promptArtifact": {
"id": "prompt-182",
"retention": "30d",
"access": "restricted"
}
}
처럼 분리할 수 있다.
구조를 세 단계로 나누면 깔끔하다.
Commit
↓
Provenance
↓
Detailed Session Log
Commit:
작은 Metadata
Provenance:
구조화된 요약 + Evidence
Session Log:
상세 Tool Call / Conversation
이다.
GitHub가 Copilot Coding Agent Commit에서 Session Log URL을 Trailer로 연결한 방식 역시 이 방향과 비슷하다.
Coding Agent Conversation은 상당히 클 수 있다.
또 민감한 정보가 들어갈 수도 있다.
그래서 Retention을 나눈다.
Commit Provenance
장기 보관
Validation Evidence
중장기 보관
Detailed Agent Conversation
30~90일
같은 식이다.
Compliance 요구에 따라 조정한다.
Commit 하나보다 PR 단위가 더 유용할 수도 있다.
예:
version: 1
contribution:
pullRequest: 1842
agents:
- product: claude-code
role: implementation
- product: internal-review-agent
role: review
human:
initiator: kim@company.com
reviewer: lee@company.com
changes:
type: bugfix
risk: medium
validation:
unitTest: passed
integrationTest: passed
lint: passed
externalDependencies:
added: false
humanApproval:
required: true
completed: true
이것을 PR 증명서처럼 생각할 수 있다.
Agent 작업은 Commit 하나에 끝나지 않는다.
Agent Commit 1
Agent Commit 2
Agent Commit 3
Human 수정
Agent 수정
Squash
가 흔하다.
Squash Merge하면 개별 Commit Provenance가 흐려질 수도 있다.
PR은 전체 Contribution의 경계로 사용하기 좋다.
PR
=
Task Boundary
+
Review Boundary
+
Validation Boundary
이기 때문이다.
거창한 Platform이 없어도 된다.
## AI Assistance
- [x] AI Coding Agent 사용
- Agent: Claude Code
- Human Initiator: @kim
## Validation
- [x] Unit Test
- [x] Build
- [x] Lint
- [ ] Integration Test
## Human Review
- [x] Agent가 생성한 Diff 전체 확인
## External Dependency
- [x] 새 Dependency 없음
이 정도만으로도 기존보다 정보가 훨씬 많아진다.
사람이나 Agent가:
[x] Test Passed
를 체크했다고 실제 Test가 통과한 것은 아니다.
그래서 CI가 Provenance를 채우게 한다.
Agent
↓
PR
↓
CI
↓
Validation Evidence
↓
Manifest Update
예:
validation:
unitTest:
status: passed
workflowRun: 829124
lint:
status: passed
workflowRun: 829125
검증 정보는 CI가 작성한다.
Agent가 직접 만들면 간단하다.
하지만 신뢰 문제가 있다.
Agent
↓
Code 작성
↓
Provenance 작성
↓
“모두 정상”
이면 자기평가가 된다.
더 강한 구조는:
Agent Runtime
↓
Execution Event
↓
Provenance Service
이다.
Agent가 직접 Metadata를 만드는 게 아니라 Runtime이 실제 Event에서 자동 생성한다.
예:
session.started
tool.executed
file.modified
test.completed
build.completed
branch.pushed
pr.created
human.approved
이벤트가 발생할 때마다 기록한다.
마지막에는:
Event Stream
↓
Provenance Builder
↓
Contribution Manifest
로 만든다.
이렇게 하면 Agent가 기억해서 적을 필요가 없다.
개발자에게 매번:
어떤 모델 썼어요?
테스트 했어요?
몇 번 Retry 했어요?
Agent Session ID 뭐예요?
를 입력시키면 곧 무너지기 시작한다.
좋은 구조:
Agent Runtime
Git
CI
PR
Review
에서 자동으로 데이터를 가져온다.
사람이 적는 것은:
왜 이 변경을 승인했는가
정도면 된다.
AI만 기록하면 안 된다.
예:
{
"contributors": [
{
"type": "agent",
"role": "implementation"
},
{
"type": "human",
"id": "kim",
"role": "initiator"
},
{
"type": "human",
"id": "lee",
"role": "reviewer"
}
]
}
중요한 질문은:
AI가 몇 퍼센트 작성했나?
보다
누가 어떤 책임을 맡았나?
일 수 있다.
Line Count로 계산할 수도 있다.
Agent 700줄
Human 300줄
하지만 사람은 Agent가 만든 700줄을 모두 검토하고 설계를 수정했을 수도 있다.
반대로 사람이 100줄만 추가했지만 결정적인 Business Logic을 작성했을 수도 있다.
그래서:
AI Contribution %
만으로 판단하는 것은 위험하다.
역할 기반 기록이 더 유용하다.
Agent
Implementation
Human
Architecture Decision
Agent
Testing
Human
Approval
2026년 공개된 연구는 1,000개의 인기 GitHub Repository를 조사해 118개의 AI Contribution Policy를 확인했다.
그중 78%는 AI 지원 Contribution을 허용했지만, 51%는 AI 사용 사실의 Disclosure를 요구했고 74%는 Human-in-the-loop를 요구했다.
즉 OSS에서도 단순한:
AI 허용 / 금지
보다:
AI 사용 사실을 밝혀라.
사람이 책임지고 확인해라.
라는 방향이 상당히 중요해지고 있다.
여기서 문제가 생긴다.
2026년 7월 공개된 RepoComplianceBench 연구는 AI Contribution Rule이 있는 49개 Repository의 106개 Issue를 이용해 Coding Agent가 실제 규칙을 따르는지 평가했다.
연구 결과 현재 Agent들은 Repository의 AI Contribution Rule을 자발적으로 찾아 읽는 경우가 거의 없었다. Rule을 Prompt에 알려주거나 Verifier Feedback을 주면 Disclosure와 Verification 수행은 개선됐지만, AI Contribution이 금지된 Repository에서도 Agent가 스스로 Contribution을 포기하지 않는 문제가 남았다.
이건 중요한 의미가 있다.
CONTRIBUTING.md에 써놨으니
Agent가 알아서 지키겠지.
라고 기대하면 안 된다는 것이다.
예:
Repository
↓
Policy Discovery
↓
Contribution Policy
↓
Agent Runtime
Repository에:
aiContribution:
allowed: true
disclosure: required
humanReview: required
verification:
- unit-test
- lint
같은 Machine-readable Policy를 둘 수 있다.
Agent가 읽지 않아도 Runtime이 강제한다.
AGENTS.md:
어떻게 코딩할 것인가
Provenance Policy:
AI Contribution을
어떻게 기록하고 검증할 것인가
이다.
예:
AGENTS.md
Architecture
Naming
Testing
.ai/contribution-policy.yaml
Disclosure
Human Gate
Audit
Retention
이렇게 나눌 수 있다.
version: 1
ai:
allowed: true
disclosure: required
human:
reviewerRequired: true
provenance:
required: true
sessionId: required
runtimeIdentity: required
validation:
required:
- build
- unit-test
- lint
externalDependency:
requireApproval: true
Agent Platform이 이 파일을 읽는다.
모든 변경에 같은 기록이 필요하지 않다.
예:
README 수정
Risk: Low
필요:
Agent Disclosure
Human Review
반면:
Authentication Logic
Risk: High
필요:
Agent Identity
Session
Runtime
Tool History
Security Test
Dependency Report
Human Reviewer 2명
처럼 달라질 수 있다.
Tier 0
Documentation
Formatting
Tier 1
일반 UI
Small Refactor
Tier 2
Business Logic
Database
Network
Tier 3
Auth
Payment
Security
Production
그리고:
tier3:
provenance: full
sessionLog: required
securityValidation: required
reviewers: 2
처럼 Policy를 정한다.
목적이:
Audit 문서 하나 더 만들기
가 되어서는 안 된다.
Reviewer에게 보여줄 정보는 간단해야 한다.
AI CONTRIBUTION
Agent
Claude Code
Initiated By
Kim
Risk
Medium
Files
8
Dependencies
No change
Build
PASS
Tests
42 / 42 PASS
Lint
PASS
Architecture
PASS
Human Review
Required
이 정도면 한눈에 들어온다.
예:
┌─────────────────────────────┐
│ Agent Contribution │
├─────────────────────────────┤
│ Agent Claude Code │
│ Session #A-182 │
│ Human @kim │
│ Risk MEDIUM │
│ Files 8 │
│ Dependency No change │
├─────────────────────────────┤
│ Build PASS │
│ Test PASS │
│ Lint PASS │
│ Security N/A │
├─────────────────────────────┤
│ Reviewer REQUIRED │
└─────────────────────────────┘
Reviewer가 먼저 이것을 보고 Diff로 들어간다.
앞으로는 하나의 PR에 Agent 하나만 참여하지 않을 가능성이 높다.
Planner Agent
↓
Coding Agent
↓
Test Agent
↓
Review Agent
라면:
{
"agents": [
{
"role": "planner",
"session": "p-182"
},
{
"role": "implementation",
"session": "c-721"
},
{
"role": "test",
"session": "t-501"
}
]
}
처럼 역할별로 기록한다.
작은 내부 Worker까지 전부 PR에 표시할 필요는 없다.
그러면 Noise가 너무 많아진다.
추천은:
Top-level Agent
PR Provenance에 표시
Subagent
Session Trace에 표시
이다.
필요할 때 Drill-down 한다.
Human
│
▼
Main Agent
│
├─ Search Agent
├─ Test Agent
└─ Security Agent
│
▼
Commit
│
▼
CI
│
▼
PR
│
▼
Reviewer
이 전체가 하나의 Contribution Graph다.
좀 더 강한 무결성이 필요하다면 Provenance Object를 Hash한다.
provenance.json
↓
SHA-256
↓
Commit Trailer
예:
Provenance-SHA256:
7ae913...
그러면 Provenance가 나중에 변경됐는지 확인할 수 있다.
SLSA가 Build Artifact Provenance를 Attestation으로 표현하는 것처럼, Agent Contribution도 Attestation 방식으로 확장할 수 있다.
예:
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [
{
"name": "git-commit",
"digest": {
"sha1": "a81f3ce"
}
}
],
"predicateType":
"https://company.example/agent-contribution/v1",
"predicate": {
"agent": "claude-code",
"session": "sess_182",
"initiator": "kim",
"validation": "ci-829"
}
}
이것은 SLSA 공식 Agent Schema가 아니라 in-toto/SLSA의 Provenance 개념을 Agent Contribution에 응용한 설계 예시다.
SLSA 자체는 Provenance를 Artifact가 어떻게 만들어졌는지 설명하는 검증 가능한 Attestation으로 정의하고 있다.
JSON 파일만 Repository에 두면 수정할 수 있다.
예:
validation: failed
↓
validation: passed
로 바꿔버릴 수 있다.
Attestation에 Signature가 있다면:
Provenance
↓
Signed by Agent Platform
↓
Verified by PR Gate
구조를 만들 수 있다.
Agent Sandbox 안에 Signing Key를 넣으면 의미가 줄어든다.
Agent가:
코드 작성
+
자기 증명서 생성
+
자기 Signature
를 모두 수행한다.
더 좋은 구조:
Agent Sandbox
↓
Runtime Event
↓
Trusted Control Plane
↓
Attestation
↓
Signature
이다.
이 역시 SLSA Build Provenance에서 Builder와 Control Plane의 신뢰 경계를 분리하는 사고방식과 비슷하다. SLSA는 builder.id가 해당 Build를 신뢰성 있게 수행하고 Provenance를 기록하는 Platform의 신뢰 경계를 표현한다고 설명한다.
Agent에게:
어느 Commit에서 시작했어?
라고 묻지 않는다.
Runtime이 Git에서 직접 읽는다.
git rev-parse HEAD
결과:
3a8cd124...
Provenance:
{
"baseRevision": "3a8cd124..."
}
이다.
git diff --binary HEAD
를 기반으로 Hash를 만들 수도 있다.
Patch
↓
Digest
↓
Provenance
그러면 Agent가 검증받은 Patch와 실제 Merge된 Patch가 같은지 확인할 수 있다.
예:
Patch SHA
4e92...
CI:
Build PASS
Test PASS
PR Merge 직전:
현재 Patch SHA
4e92...
같음.
그러면:
검증 이후 코드가 바뀌지 않았다.
를 확인할 수 있다.
흔한 상황이다.
Agent Patch
↓
Human 수정
↓
Final Patch
Provenance는 이를 숨기지 않는다.
{
"agentContribution": true,
"humanModificationAfterAgent": true
}
정도로 남길 수 있다.
하지만 줄 단위 Attribution을 완벽하게 계산하려고 할 필요는 없다.
몇 줄을 누가 썼는지를 100% 밝히는 것보다:
이 Task는 누가 시작했는가?
Agent가 어떤 권한으로 작업했는가?
누가 결과를 승인했는가?
무슨 검증을 통과했는가?
가 훨씬 중요하다.
다른 접근은:
이 코드를 분석해서
AI가 썼는지 찾아내자.
이다.
하지만 이것은 사후 추정이다.
Provenance는 반대 방향이어야 한다.
생성 순간부터
Metadata를 남긴다.
즉:
Detection
X
Attestation
O
이다.
Detection:
Code
↓
Classifier
↓
AI 작성 확률 82%
Attestation:
Agent Session
↓
Runtime Event
↓
Commit
↓
Signed Evidence
두 방식의 신뢰 수준이 다르다.
AI가 만든 코드와 사람이 만든 코드의 Style이 점점 비슷해질수록 Detection은 더 어려워질 수 있다.
반면 Provenance는 생성 과정에서 기록된다.
2026년 연구에서는 AI Contribution 증가 속도가 Maintainer가 Risk와 Evidence를 평가할 수 있는 속도보다 빠를 수 있다는 문제를 지적하고 있다.
Agent Governance Manifest 연구는 Repository 수준에서 AI Contribution을 관리하려면 단순한 Agent-readable Rule이나 Trace만으로는 부족하고 Risk, Evidence, Accountability, Review Gate를 함께 구조화해야 한다고 제안한다.
이게 바로 Provenance가 단순 Metadata에서 끝나면 안 되는 이유다.
단계가 이렇게 발전한다.
1.
Agent-readable
Agent가 Rule을 읽을 수 있다.
↓
2.
Traceable
누가 무엇을 했는지 추적할 수 있다.
↓
3.
Governable
Risk에 따라 Policy와 Approval을 강제할 수 있다.
최근 Agent Governance 연구 역시 비슷하게 agent-readability, traceability, governability의 세 층으로 문제를 정리한다.
repo/
├── AGENTS.md
│
├── .ai/
│ ├── contribution-policy.yaml
│ └── provenance-schema.json
│
├── .github/
│ ├── pull_request_template.md
│ └── workflows/
│ └── agent-provenance.yml
│
└── src/
각 역할은:
AGENTS.md
Coding Rule
contribution-policy.yaml
Governance
provenance-schema.json
Metadata Contract
CI
Verification
이다.
Developer
"이 Bug 수정해줘."
↓
Agent Runtime
Session 생성
↓
Coding Agent
수정
↓
Runtime
Provenance Event 수집
↓
Agent
Branch Push
PR 생성
↓
CI
Build
Test
Lint
Security
↓
Provenance Service
Manifest 생성
↓
PR Check
Policy 검증
↓
Human Reviewer
Diff + Evidence 검토
↓
Merge
이다.
rules:
aiDisclosure:
required: true
provenance:
required: true
validation:
build: required
test: required
humanReview:
required: true
PR이 조건을 충족하지 않으면:
MERGE BLOCKED
한다.
Agent identity detected
+
No provenance
이면:
BLOCK
또는 최소:
WARNING
을 낼 수 있다.
정책 수준에 따라 다르게 한다.
여기서 Scope를 정해야 한다.
IDE에서:
한 줄 자동완성
까지 Provenance로 남기기 시작하면 Noise가 너무 많아진다.
처음에는 다음 기준이 현실적이다.
Agent가 독립 Task를 수행했는가?
Repository를 탐색했는가?
여러 파일을 수정했는가?
Shell / Test를 실행했는가?
Commit / PR을 만들었는가?
여기에 해당하면 Agent Contribution으로 본다.
Autocomplete
No Provenance
Chat Suggestion
Optional
Agent File Modification
Disclosure
Agent Commit / PR
Full Provenance
정도로 시작할 수 있다.
기업이 Coding Agent를 수백 명에게 배포하면 보안팀에서 언젠가는 묻게 된다.
어떤 Repository에서
Agent를 사용하고 있나요?
누가 Agent 작업을 승인했나요?
Agent가 Production Credential을 사용했나요?
Agent 코드가 어떤 검증을 받았나요?
Provenance가 있다면 답하기 쉬워진다.
예:
SELECT *
FROM agent_contributions
WHERE risk = 'high'
AND human_review = false;
또는:
SELECT *
FROM agent_contributions
WHERE external_dependency_added = true;
또는:
SELECT *
FROM agent_contributions
WHERE validation_status != 'passed';
처럼 볼 수 있다.
어떤 취약한 코드가 발견됐다.
Commit
a81f3ce
Provenance를 따라간다.
Commit
↓
Agent Session
↓
Task
↓
Runtime
↓
Tool Calls
↓
Validation
↓
Reviewer
어떤 경로로 문제가 들어왔는지 빠르게 알 수 있다.
예:
Agent
↓
npm install obscure-package
↓
Commit.
Provenance:
{
"dependencyChanges": [
{
"package": "obscure-package",
"action": "added",
"approved": false
}
]
}
CI가:
External Dependency Approval Missing
으로 막을 수 있다.
기존 Software Supply Chain에서는:
Source
↓
Build
↓
Artifact
의 Provenance를 관리했다.
Agent 시대에는 그 앞 단계가 추가된다.
Human Intent
↓
Agent
↓
Source Change
↓
Build
↓
Artifact
즉 Software Supply Chain의 출발점이 한 단계 앞으로 이동한다.
SLSA 1.2는 Provenance를 Build에만 한정하지 않고 Source Track도 별도로 다룬다. Source Provenance는 Source Code Revision과 그 생성 과정의 Change Management를 추적하는 방향이다.
Coding Agent Provenance 역시 이 Source 단계와 매우 가까운 문제다.
현재 SLSA에는 공식적으로:
Claude Code Agent Provenance
Codex Provenance
Copilot Agent Provenance
같은 표준 Schema가 있는 것은 아니다.
GitHub는 자체적으로 Copilot Coding Agent Commit과 Session Log 연결 기능을 제공하고 있고, 연구와 OSS 정책은 AI Disclosure와 Human Review 쪽을 빠르게 다루고 있다.
따라서 이 글에서 제안한:
Agent Contribution Manifest
Agent Attestation
PR 증명서
는 이러한 흐름을 기반으로 한 실무 Architecture 제안이다.
처음부터 Attestation Platform을 만들 필요는 없다.
1단계:
PR Template
AI 사용 여부
Agent 이름
Human Reviewer
2단계:
Commit Trailer
Agent Session
Human Initiator
3단계:
CI Validation Metadata
4단계:
Structured Provenance JSON
5단계:
Signed Attestation
순으로 가면 된다.
## Agent Contribution
Agent:
Claude Code
Initiated by:
@kim
Session:
A-182
Validation:
- Build ✅
- Test ✅
- Lint ✅
External dependencies:
None
Human review:
@lee
이걸 PR에 자동 생성한다.
Agent Gateway
↓
Session
↓
Runtime Events
↓
Provenance Service
↓
Signed Manifest
↓
GitHub / GitLab Check
이 구조가 더 적합하다.
Identity
Agent
Human
Runtime
Input
Repository
Base Revision
Task
Execution
Session
Policy
Tool
Output
Commit
Patch Digest
Verification
Build
Test
Lint
Security
Governance
Risk
Human Review
Approval
정도다.
Provenance를 많이 남긴다고 무조건 좋은 것은 아니다.
예:
Prompt 전체
모든 Shell Output
모든 Internal URL
모든 DB Query
를 영구 저장하면 새로운 보안 문제가 생긴다.
따라서:
Minimum Necessary Evidence
원칙이 중요하다.
예:
Test
PASS
Provenance에 저장.
상세:
20MB test.log
Artifact Storage에 저장.
필요할 때만 링크를 따라간다.
Runtime Event:
curl -H "Authorization: Bearer abc..."
를 그대로 저장하면 안 된다.
Audit Pipeline:
Event
↓
Secret Scanner
↓
Redaction
↓
Storage
를 거친다.
예:
Low Risk
Session Log 30일
Medium Risk
90일
High Risk
1년
처럼 정책을 둘 수 있다.
실제 기간은 조직 Compliance 요구에 맞춘다.
이 구조를 만든다고:
Agent Provenance PASS
↓
자동 Merge
해야 하는 것은 아니다.
Provenance는 Reviewer가 무엇을 믿을 수 있는지 명확하게 만들어주는 Evidence Layer다.
앞으로 PR Review 순서가:
Diff
↓
Test
에서:
Contribution Manifest
↓
Risk
↓
Validation
↓
Diff
↓
Human Decision
으로 바뀔 수도 있다.
특히 AI가 만든 PR 수가 늘어날수록 그렇다.
Coding Agent 시대의 문제는:
AI가 코드를 작성한다.
자체가 아니다.
더 어려운 문제는:
AI가 작성한 코드가
조직의 기존 Software Governance 안으로
어떻게 들어오는가?
이다.
이걸 해결하려면:
Agent Identity
Traceability
Validation
Human Accountability
Policy
Attestation
이 필요하다.
Git은 오랫동안 Software Development의 기록 시스템 역할을 해왔다.
누가
언제
무엇을
왜
바꿨는지를 남겼다.
Coding Agent가 개발 과정에 들어오면서 하나의 질문이 더 생긴다.
어떻게 만들어졌는가?
앞으로 Commit 하나에는 단순한 Diff보다 훨씬 많은 과정이 숨어 있을 수 있다.
Human
↓
Main Agent
↓
Subagents
↓
Tools
↓
Runtime
↓
Tests
↓
Reviewer
그래서 Git History만으로는 Software Change의 전체 경로를 설명하기 어려워진다.
필요한 것은 AI Detection이 아니다.
이 코드는 AI가 만들었을 확률이 87%.
가 아니라:
이 변경은
Claude Code Session A-182가 만들었고,
Kim이 작업을 시작했고,
Self-hosted Runner 42에서 실행됐으며,
Build와 Test를 통과했고,
Lee가 최종 Review했다.
라고 말할 수 있어야 한다.
핵심 구조는 다음과 같다.
Agent Task
↓
Execution Trace
↓
Source Change
↓
Validation Evidence
↓
Human Review
↓
Provenance
↓
Commit / PR
그리고 Provenance는 가능하면 Agent의 자기 보고가 아니라:
Agent Runtime
Git
CI
Review System
에서 자동으로 만들어져야 한다.
한 줄로 정리하면:
AI Coding Agent 시대에는 코드의 내용만 Review하는 것이 아니라, 그 코드가 어떤 Agent·Runtime·Policy·Validation·Human Review를 거쳐 만들어졌는지까지 함께 Review하는 시대가 오고 있다.
Git이 코드의 History를 기록했다면, 다음 단계는 Agent가 만든 Software Change의 History까지 기록하는 것이다.
GitHub — Trace any Copilot coding agent commit to its session logs
GitHub Copilot Coding Agent Commit에서 Agent를 Author, 작업을 시작한 사람을 Co-author로 기록하고 Agent-Logs-Url Trailer를 통해 Commit과 실제 Agent Session Log를 연결하는 기능.
SLSA 1.2 — Provenance
Software Artifact가 어디에서, 언제, 어떤 과정으로 생성됐는지 추적할 수 있는 검증 가능한 정보로 Provenance를 정의하며 Build와 Source Provenance를 별도로 다룬다.
SLSA 1.2 — Build Provenance
Builder, Build Definition, Input, Run Details 등을 기록해 Artifact가 예상된 Build Process를 통해 만들어졌는지 검증할 수 있도록 하는 공식 Provenance Schema.
A First Look at Coding Agents' Compliance with AI Contribution Rules in Open-Source Communities
AI Contribution Rule이 존재하는 49개 Repository의 106개 Issue를 기반으로 Coding Agent Compliance를 평가한 연구. Agent가 Rule을 자발적으로 검색하는 경우가 거의 없었고, Prompt·Rule Disclosure·Verifier Feedback을 통해 Disclosure와 Verification은 개선할 수 있었지만 AI 금지 Repository에서의 자발적 거부는 해결되지 않았다.
AI Policy, Disclosure, and Human in the Loop: How Are Contribution Guidelines Adapting to GenAI?
인기 GitHub Repository 1,000개를 분석해 118개의 AI Contribution Policy를 확인한 연구. 분석된 Policy의 51%가 AI 사용 Disclosure를 요구했고 74%가 Human-in-the-loop를 요구했다.
Making Agent-Mediated Contributions Governable
AI Contribution Governance를 Agent-readability, Traceability, Governability의 세 단계로 바라보고 Risk·Evidence·Accountability·Review Gate를 Repository 수준에서 구조화해야 한다고 제안한 최근 연구.
GitHub는 이미 Copilot Coding Agent의 Commit을 실제 Agent Session Log와 연결하기 시작했다. 이는 Agent가 생성한 Source Change에 “누가 시작했고 어떤 Agent Session에서 나왔는가”라는 Provenance가 실제 제품 기능으로 들어오기 시작했다는 의미다.
최근 OSS 연구에서도 단순한 AI 사용 허용 여부보다 Disclosure, Verification, Human Review가 중요한 Governance 요소로 나타나고 있다. 하지만 Coding Agent가 Repository의 Contribution Rule을 스스로 찾아 읽고 준수할 것이라고 가정하기 어렵기 때문에, 중요한 정책은 Prompt가 아니라 Runtime·CI·Merge Gate에서 결정론적으로 강제하는 편이 안전하다.
SLSA의 Provenance 개념은 현재 Agent Contribution 전용 표준은 아니지만, Source → Builder → Artifact의 생성 경로를 검증 가능한 Metadata로 남긴다는 사고방식은 Coding Agent에도 그대로 적용할 수 있다. 따라서 실무에서는 Commit Trailer → PR Manifest → CI Evidence → Signed Attestation 순으로 단계적으로 도입하는 방식이 현실적이다.