반복 잡무를 설명하면, 에이전트가 도구를 직접 만들어 자기 능력으로 등록한다.
맞다톤 2026 출품작 · 개인 생산성 향상 웹 앱
배포: https://ca-web-onfvnhccevt2q.blackforest-e0d48dbe.koreacentral.azurecontainerapps.io · 에이전트 진입점: /llms.txt · API 문서: /docs
로그인·회원가입·토큰이 전혀 없습니다. 위 주소를 열면 바로 사용할 수 있습니다.
기존 AI 비서는 요청할 때마다 매번 처음부터 추론합니다. Chore Forge는 다릅니다. 한 번 설명한 잡무는 실행 가능한 도구로 벼려져 영구히 남고, 두 번째부터는 LLM 호출 없이 수십 밀리초 만에 끝납니다. 에이전트가 스스로 능력을 늘려가는 자가 확장(self-extending) 구조입니다.
| 기존 방식 | Chore Forge | |
|---|---|---|
| 1회차 | 손으로 25분 | 설명 → 약 100초 (도구 생성·검증·승인) |
| 2회차 이후 | 손으로 25분 | 0.02초 (등록된 도구 재실행, 모델 호출 없음) |
| 한계비용 | 매번 동일 | 0에 수렴 |
대상 사용자: 매주 주간보고 작성, CSV 정제, 회의록에서 실행항목 추출 같은 정형 잡무를 반복하는 개발자·직장인.
실측 예시 — "커밋 로그를 주간보고 마크다운으로 정리" 도구: 1회차 97.7초에 생성·검증 완료, 2회차부터 0.021초. 실행 1회당 25분 절약.
사용자: "이번 주 커밋 로그를 주간보고 마크다운으로 정리해줘"
│
├─ ① SpecAgent 잡무 → 검증 가능한 JSON 명세
├─ ② BuilderAgent Copilot SDK로 파이썬 도구 코드 생성
├─ ③ Sandbox 격리 실행. 실패하면 오류를 Builder에게 되돌려 자가 수정 (최대 2회)
├─ ④ VerifierAgent 샌드박스를 실제 tool 로 호출해 독립 검증 → pass/fail 판정
│
└─ ⑤ 이중 게이트 샌드박스 통과 AND Verifier pass 를 모두 만족해야 자동 등록
│ (둘 중 하나라도 실패하면 보류 + 사유 표시)
│
└─ Skill Registry (PostgreSQL) — 이후 한 번의 클릭으로 재실행
flowchart LR
U["사용자 · AI 심사 에이전트"]
subgraph ACA["Azure Container Apps"]
direction TB
API["FastAPI<br/>단조 파이프라인 · 스킬 실행 API"]
SBX["샌드박스<br/>AST 허용목록 + rlimit 격리 서브프로세스"]
API -->|"코드 실행"| SBX
end
subgraph AF["Microsoft Agent Framework · GitHubCopilotAgent"]
direction TB
A1["① SpecAgent<br/>명세 생성"]
A2["② BuilderAgent<br/>코드 생성"]
A3["④ VerifierAgent<br/>독립 검증"]
A1 --> A2 --> A3
end
U -->|"SSE /api/forge"| API
API -->|"ChatAgent 프로토콜"| A1
A3 -->|"pass / fail 판정"| API
A2 -.->|"③ 샌드박스 오류 피드백<br/>자가 수정 최대 2회"| A2
A3 -.->|"tool 로 호출"| SBX
A1 --> CP["GitHub Copilot SDK"]
A2 --> CP
A3 --> CP
API -->|"이중 게이트 통과 시 등록"| PG[("Azure Database for PostgreSQL<br/>skills · runs")]
KV["Key Vault<br/>Managed Identity"] -->|"DATABASE_URL · Copilot 토큰"| API
자가 수정 루프와 Verifier의 독립 검증이 이 구조의 핵심입니다. 생성된 코드는 Builder 자신이 아니라 샌드박스의 실제 실행 결과와 별도 에이전트의 판정을 통과해야만 영구 스킬이 됩니다.
- 세 에이전트 전부
agent-framework-github-copilot의GitHubCopilotAgent로 구동 — Copilot SDK가 실제 모델 백엔드이자 에이전트 런타임입니다. - Copilot SDK의 고유 강점(코드 생성·수정) 을 제품의 핵심 기능으로 사용합니다. Chore Forge의 산출물은 텍스트가 아니라 실행 가능한 프로그램입니다.
- SDK의 permission handler(
on_permission_request)를 명시적으로 구성해 에이전트의 도구 호출 권한을 코드 레벨에서 통제합니다. - 인증:
COPILOT_GITHUB_TOKEN(fine-grained PAT)을 Key Vault에서 주입.
| 사용 요소 | 위치 |
|---|---|
| 다중 에이전트 파이프라인 (Spec → Build → Verify) | app/orchestrator.py |
커스텀 tool 호출 — VerifierAgent가 execute_in_sandbox 함수를 실제 호출 |
ForgeRun._verify |
| 세션(컨텍스트) 관리 — 자가 수정 루프가 대화 맥락을 유지 | builder.create_session() |
스트리밍 — agent.run(..., stream=True) 델타를 SSE로 그대로 중계 |
_stream_text |
OpenTelemetry 관측성 — configure_otel_providers() → Application Insights |
app/main.py |
필요한 것만 씁니다. 각 서비스에 앱상의 필연적 이유가 있습니다.
| 서비스 | 왜 필요한가 |
|---|---|
| Container Apps | Copilot SDK가 CLI를 자식 프로세스로 띄우므로 상주 프로세스가 필요. Functions Consumption 부적합. 콜드스타트 회피를 위해 minReplicas: 1 |
| Database for PostgreSQL (유연 서버, Burstable B1ms) | 벼려낸 스킬과 실행 기록은 영구 자산. 재배포·스케일아웃 후에도 살아남아야 함. 로컬 docker compose와 동일한 엔진이라 환경 간 차이가 없음 |
| Key Vault | GitHub 토큰을 Container App secret이 keyVaultUrl로 참조. 이미지·환경변수에 평문 비밀 없음 |
| 관리 ID (사용자 할당) | ACR pull과 Key Vault 접근을 암호 없이 처리. DB 접속 문자열도 Key Vault 시크릿으로만 주입 |
| Application Insights + Log Analytics | 에이전트 실행을 OTel 트레이스로 관측 |
adminUserEnabled: false — 레지스트리 키 인증을 인프라 수준에서 차단했고,
DB 자격 증명은 Key Vault를 통해서만 컨테이너에 도달합니다.
앱 자체에는 인증이 없습니다. 심사 에이전트가 로그인 없이 모든 기능에 접근할 수 있어야 하기 때문입니다. 설계 근거는 PRD §5.5.
- 2중 샌드박스 (
app/sandbox.py) — 생성 코드가 실행되는 유일한 경로- 정적: AST 스캔으로 허용 목록 밖의 import와
eval/exec/open/dunder 접근을 실행 전에 차단 - 동적: 별도 프로세스 · 세션 격리(
setsid) · 세척된 환경변수 · 임시 작업 디렉터리 · CPU 5초 · 메모리 512MB · 파일 8MB · 벽시계 12초 제한
- 정적: AST 스캔으로 허용 목록 밖의 import와
- 등록에는 두 관문을 모두 통과해야 합니다 — ①샌드박스가 코드를 실행할 수 있는지, ②VerifierAgent가 올바른 일을 하는지 판정. 둘 중 하나라도 실패하면 초안으로 남아 사람의 검토를 기다립니다. 자동 등록의 안전은 승인 클릭이 아니라 이 두 관문이 담당합니다.
- 사용자 통제권 — 진행 중 중단, 등록 후 취소·삭제가 상시 가능하며, 승인 게이트를 켜면 사람이 코드를 검토·승인해야만 등록됩니다. (기본 꺼짐 — 설계 근거는 PRD §5.4, TRD §8.4)
- AI 생성 표시 — 모든 AI 산출물에
AI 생성배지를 붙이고, 생성된 코드 전문과 샌드박스 실행 결과, Verifier 판정을 항상 노출합니다. - 프롬프트 인젝션 방어 — 사용자 입력을
<chore>태그로 감싸 신뢰 경계를 명시하고, 역할 변경·지시 유출·범위 밖 행동을 거부하도록 지시. 에이전트 자신은 셸·파일·네트워크 접근이 금지되며 우리가 등록한 함수만 호출할 수 있습니다. - 환각 완화 — VerifierAgent는 결과를 예측하지 못하고 반드시 샌드박스를 실제로 호출해야 합니다. 최종 판정은 실행 결과에 근거합니다.
- 비밀 관리 — 토큰은 Key Vault에만. 소스·이미지·로그에 남지 않습니다.
앱과 PostgreSQL이 함께 뜹니다.
export COPILOT_GITHUB_TOKEN=github_pat_... # 클래식 ghp_ 토큰은 지원되지 않습니다
docker compose up --build
# → http://localhost:8080첫 부팅에 데모 스킬 3개가 자동으로 심어지므로 빈 화면을 마주할 일이 없습니다. 이 스킬들도 특별 대우 없이 다른 코드와 똑같이 샌드박스를 통과해야 등록됩니다.
토큰은 새 도구를 단조할 때만 필요합니다. 없어도 앱은 정상 기동하며,
등록된 스킬 실행·조회·지표·실행 기록이 모두 동작합니다. 이 경우 UI와
/healthz가 무엇이 가능하고 무엇이 불가능한지 명시적으로 알려줍니다.
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m uvicorn app.main:app --port 8080DATABASE_URL이 없으면 인메모리 레지스트리로 자동 폴백하므로 Postgres 없이도 뜹니다.
az login
./deploy.sh github_pat_...deploy.sh가 azd 환경 구성, PostgreSQL 관리자 암호 생성, 프로비저닝, 배포,
헬스체크까지 처리합니다.
app/
main.py FastAPI · SSE 스트림 · 스킬 REST API · 스킬 런타임
orchestrator.py Agent Framework 파이프라인 (Spec → Build → Verify + 자가 수정)
sandbox.py 정적 AST 검사 + 격리 서브프로세스 실행
store.py PostgreSQL 스킬 + 실행 기록 (인메모리 폴백)
seed.py 첫 부팅 시 심는 데모 스킬 3개
forge_state.py Copilot 자격 증명 가용성 상태
models.py Skill 도메인 모델
static/index.html 단일 파일 프론트엔드 (빌드 스텝 없음)
infra/ Bicep IaC — Container Apps · PostgreSQL · Key Vault · 관리 ID · App Insights
docker-compose.yml 앱 + PostgreSQL 로컬 스택
| 메서드 | 경로 | 설명 |
|---|---|---|
POST |
/api/forge |
잡무 설명 → 파이프라인을 SSE로 스트리밍 |
POST |
/api/skills/{id}/approve |
초안 스킬 등록 (보류된 스킬 수동 승인) |
POST |
/api/skills/{id}/reject |
거부 |
POST |
/api/skills/{id}/run |
승인된 스킬 실행 (승인 전에는 403) |
GET |
/api/skills · /api/skills/{id} |
스킬 목록 · 단건 상세(코드 포함) |
GET |
/api/runs |
실행 기록 |
GET |
/api/stats |
절약 시간·속도향상 지표 |
GET |
/api/agent/guide · /llms.txt |
AI 에이전트용 자기설명 가이드 |
GET |
/docs · /openapi.json |
한국어 설명이 붙은 OpenAPI |
GET |
/healthz |
헬스체크 (저장소·단조 가용성 포함) |
인증이 없으므로 위 엔드포인트는 모두 그대로 호출할 수 있습니다.
처음 방문하는 에이전트는 /llms.txt 부터 읽으면 됩니다.
| 기준 | 배점 | 대응 | 근거 위치 |
|---|---|---|---|
| Copilot SDK · Agent Framework 활용 | 25% | 세 에이전트를 GitHubCopilotAgent로 구동. Verifier는 샌드박스를 실제 tool로 호출해 독립 검증하고, 그 판정이 등록 여부를 실제로 좌우함 |
app/orchestrator.py |
| 생산성 향상 | 18% | 1회차 약 100초 → 2회차부터 0.02초. 실측 속도향상 8,000× 이상, 실행마다 절약 시간 누적 | /api/stats, 대시보드 |
| Azure 통합 | 18% | Container Apps + PostgreSQL Flexible Server + Key Vault + Managed Identity가 핵심. 나머지(ACR·Log Analytics·App Insights)는 컨테이너 구동과 관측에 필수인 것만. 점수를 위한 과잉 서비스 없음 | infra/resources.bicep |
| 완성도 | 16% | 39개 테스트 통과, Docker Compose 원커맨드 기동, 시드 스킬 3종이 부팅 시 자체 검증 | tests/, docker-compose.yml |
| UX | 12% | 6개 화면 사이드바 SPA, 라이트·다크 자동 전환, 파이프라인 실시간 SSE 스트리밍, 보류 사유 설명 | app/static/index.html |
| 책임 있는 AI | 6% | 이중 게이트(샌드박스 + Verifier), 2계층 샌드박스 격리, 코드 전문 공개, 무인증 결정의 트레이드오프 명시 | PRD §5.5, TRD §8.8–8.9 |
| 혁신성 | 5% | 도구를 쓰는 에이전트가 아니라 도구를 만들어 자기 능력으로 등록하는 자가 확장 구조 | §2 아키텍처 |
| 문서 | 내용 |
|---|---|
PRD.md |
제품 요구사항 — 문제 정의, 사용자, 플로우, 수용 기준, 결정 기록 |
TRD.md |
기술 요구사항 — 아키텍처, 에이전트 계층, 샌드박스, 트레이드오프, 구현 기록 |
AGENTS.md |
AI 코딩 에이전트를 위한 작업 규칙·명령어·가드레일 |