PRODUCT → SYSTEM → DELIVERY

에이전트 개발 기획서

모델의 판단을 실제 업무로 연결하는 설계.
목표·도구·권한·데이터·검수를 하나의 개발 기준으로 정한다.

REFERENCE PROJECT

사내 업무 지원 에이전트

권한 있는 자료에서 근거를 찾고,
답변과 업무 초안을 만든 뒤,
사람의 승인으로 티켓을 등록한다.

입력
업무 요청 + 접근 가능한 내부 자료
출력
근거 답변 + 승인된 업무 티켓
원칙
단일 에이전트 · 제한된 읽기 · 승인 후 쓰기

1.1개발할 제품을 한 문장으로 고정한다

PROJECT BRIEF / AP-001

사내 자료를 찾아 근거 있는 답변과 업무 초안을 만들고, 담당자가 승인한 내용만 업무 시스템에 등록한다.

사용자
프로젝트 담당자 · 검토 책임자 · 운영자
첫 업무
프로젝트의 QA 누락을 확인하고 후속 티켓 제안
입력
사용자 요청, 읽기 가능한 문서, 기존 티켓
완료
출처 있는 답변 또는 승인된 티켓의 등록 영수증
이 예제의 쓰임검색·검증·초안·승인·등록이라는 공통 구조를 구체화한 기준 프로젝트다. 학회 규정 점검, 고객 지원, 사내 자료 분석으로 바꿀 때는 자료 유형·도구·승인 권한·정답 세트를 교체한다.

1.2자동화의 범위와 사람의 역할

업무에이전트가 수행사람·서버가 결정이번 범위에서 제외
자료 조사질의 구성·관련 문서 검색·근거 선택서버가 문서 접근 범위 제한웹 전체 검색·임의 파일 탐색
누락 분석요구사항과 QA 기록 대조·불확실성 표시담당자가 사실 관계와 우선순위 검토모델의 추정만으로 완료 판정
업무 초안제목·설명·관련 근거·담당 후보 제안사람이 내용·담당·기한 확정자동 결제·이메일 발송·자료 삭제
티켓 등록구조화된 등록안 제안서버가 승인된 payload만 외부 전송모델이 직접 외부 쓰기 API 호출

1.3기능 요구사항과 인수 기준

ID구현 요구완료 조건
FR-01계정·조직·프로젝트 권한다른 조직·비할당 프로젝트의 자료·결과·근거 모두 접근 불가
FR-02요청 접수·중복 방지동일 요청 키는 동일 run 반환; 다른 본문으로 키 재사용 시 409
FR-03입력·정책 버전 고정문서 revision, 검색 index snapshot, prompt·model·tool·policy 버전 기록
FR-04제한된 읽기 도구허용된 4개 도구만; tenant·ACL은 서버 컨텍스트에서 주입
FR-05근거 있는 결과주장별 evidence ID; 부족한 근거는 불확실성·추가 질문으로 표시
FR-06업무 초안·검토·승인화면에 보인 revision·payload hash와 승인 대상이 동일
FR-07승인 후 외부 등록동일 action key로 최대 한 번의 업무 효과; 영수증 보관
FR-08제한·취소·복구호출·시간·비용 상한, checkpoint, lease와 fencing 적용
FR-09작업·근거·검토 화면상태를 실행/검토/반영으로 나누고 근거를 직접 열람
FR-10실행·승인 감사행위자·도구·버전·상태·사용량·결과 추적; 민감 원문 로그 제외
FR-11평가와 회귀 차단정답 세트와 권한·중복·장애 시나리오 통과
FR-12운영 중지·백업·삭제신규 실행 정지, 불명확한 반영 조사, 복원·만료 삭제 절차

1.4성공을 어떤 숫자로 판단할 것인가?

지표초기 목표 · 실측 전측정 방법
근거 답변 적합률≥95%지원 범위의 평가 요청 중 전문가가 답변·근거 모두 적합하다고 판정한 비율
근거 부족 처리평가 세트에서 위험한 단정 0건정보 없음·상충 문서 사례에서 보류·질문 반환 여부
권한·승인평가에서 교차 조직 누출·무승인 쓰기 0건서버 정책 테스트 + 도구 호출 기록 + 외부 결과
중복 등록장애 시나리오에서 중복 티켓 0건같은 action key의 외부 티켓 수
시간·비용실행 120초 상한·run별 예산 적용queue 대기와 실행 시간 분리; 실제 provider 사용량으로 계산

초기 목표는 보장된 성능이 아니다. 실제 자료·모델·외부 연동으로 측정한 결과를 인수 문서에 기록한다.

2.1모델은 판단하고, 실행 시스템은 권한과 상태를 관리한다

서비스 구성과 실행 책임FIG. 01
서비스 구성과 실행 책임하네스는 모델 호출·도구·컨텍스트·상태·제한을 묶는 서버 코드다. 문서 접근과 외부 쓰기는 모델의 지시만으로 허용되지 않는다.HTTPS트랜잭션작업 claim읽기 도구제한된 호출승인 Outbox조건부 등록업무 화면요청 · 근거 · 승인업무 API로그인 · 권한 · 입력 검증상태 저장소run · proposal · outbox자료 어댑터버전 · ACL · 근거 구간실행 하네스루프 · 예산 · 도구 · 복구모델 어댑터판단 · 도구 · 구조화 응답기존 업무 시스템티켓 생성 · 등록 결과 조회반영 처리기승인 payload · action key
하네스는 모델 호출·도구·컨텍스트·상태·제한을 묶는 서버 코드다. 문서 접근과 외부 쓰기는 모델의 지시만으로 허용되지 않는다.

2.2채택 구조와 대안의 판단 근거

결정이번 기준안변경 조건
ADR-01 · 자율성단일 에이전트 + 제한된 읽기 + 코드로 제어하는 쓰기고정 경로만으로 해결되면 일반 워크플로로 단순화
ADR-02 · 다중 에이전트초기 범위 제외독립 조사·통합 비용을 포함한 동일 예산 평가에서 품질 향상 입증
ADR-03 · 연결 방식내부 함수 도구 + 기존 시스템 어댑터여러 실행 제품에서 같은 도구를 공유하면 MCP 연결 검토
ADR-04 · 자료 검색ACL 필터가 있는 검색 인덱스, 문서 revision별 근거키워드 검색의 누락을 측정한 뒤 의미 검색을 추가
ADR-05 · 모델 교체provider adapter로 응답·usage·stop reason 정규화선택 모델·SDK 버전을 고정하고 변경 때 회귀 평가
ADR-06 · 저장·큐MySQL 작업 테이블과 lease, 별도 worker처리량·대기시간 측정으로 전용 큐 필요성 판단
화면바닐라 JavaScript + Tailwind CSS요청·근거·검토 UI
업무 서버Node.js + Fastify · JavaScript인증·정책·HTTP API
실행 서버별도 worker + provider adapter루프·검증·복구
데이터MySQL + 비공개 객체 저장소 + ACL 검색상태·원본·검색 분리

2.3저장할 데이터와 불변 조건

실행 결과와 승인 대상을 분리해 저장한다FIG. 02
실행 결과와 승인 대상을 분리해 저장한다모든 업무 레코드에 tenant_id를 포함한다. 근거 연결은 result_evidence 관계 테이블로 구현한다. proposal의 현재 revision pointer와 과거 revision을 구분한다.1 : 0..11 : N revisions1 : NN : N1 : 0..1승인만runs요청·정책 snapshotresults답변·근거·불확실성proposal_revisions등록할 payload · hashrun_events단계·호출·usageevidence문서 revision · ACL 참조decisions사람·revision·결정executionsaction key · 외부 영수증
모든 업무 레코드에 tenant_id를 포함한다. 근거 연결은 result_evidence 관계 테이블로 구현한다. proposal의 현재 revision pointer와 과거 revision을 구분한다.
테이블·핵심 필드키·일관성 조건
runs · id, tenant_id, requester_id, project_id, status, policy_version, index_snapshot, deadline, lease_until, fencing_token, budget_jsonPK(tenant_id,id); 예산·deadline은 재시작 후 초기화하지 않음
run_events · run_id, seq, event_type, payload, created_atUNIQUE(tenant_id,run_id,seq); 원문 대신 근거 ID·메타데이터
results · run_id, answer_json, result_hashUNIQUE(tenant_id,run_id); 성공 결과는 불변
evidence · document_id, revision_id, segment_id, quote_hash, acl_ref근거 조회 때 현재 ACL 재검사; 저장 근거는 당시 revision 고정
proposals / proposal_revisions · current_revision, payload_json, payload_hash, expires_atUNIQUE(tenant_id,proposal_id,revision); 수정은 새 revision, 이전 승인 승계 금지
decisions · proposal_id, revision, payload_hash, decision, actor_id, reasonUNIQUE(tenant_id,proposal_id,revision); APPROVED 또는 REJECTED
executions · proposal_id, revision, action_key, status, receipt, retry_atUNIQUE(tenant_id,proposal_id,revision); UNIQUE(action_key)
idempotency_requests / audit_events요청 키와 payload hash 보존; 감사는 일반 API에서 수정 불가
result_evidence · result_id, evidence_id, claim_id복합 FK에 tenant_id 포함; 존재하지 않는 근거 연결 금지

2.4외부 시스템이 제공해야 할 계약

계약필수 기능없을 때의 범위
INT-01 · 인증사용자·조직·프로젝트·문서 권한 검증인증 어댑터 확정 전 실제 자료 연결 금지
INT-02 · 문서revision별 본문·구간 조회, 현재 ACL, 갱신 이벤트불변 스냅샷 생성 또는 해당 자료를 근거에서 제외
INT-03 · 티켓action key 기반 멱등 생성 + 같은 키로 결과 조회티켓 초안·승인까지만 제공; 자동 등록 비활성
INT-04 · 조건등록 대상 프로젝트·담당자 권한, 외부 조건 검사서버에서 확정할 수 없는 대상은 사용자 재선택
개발 착수 gate연동 담당자는 인증 방식·샘플 응답·오류 코드·호출 제한·멱등 보장 범위를 확인한다. 위 기능이 기존 시스템에 이미 존재한다고 가정하지 않는다.

3.1읽기 판단 루프와 쓰기 경로를 분리한다

요청부터 승인된 업무 등록까지FIG. 03
요청부터 승인된 업무 등록까지모델은 등록안을 만들지만 create_task를 직접 호출하지 않는다. 추가 질문에 대한 답변은 새 run으로 이어지며 이전 run과 연결한다. 승인 후에는 모델을 다시 호출해 payload를 바꾸지 않는다.작업 생성도구 요청결과 피드백최종 응답불충분등록안 포함답변만사람 승인요청 검증권한·목표·범위·멱등 키다음 행동 판단읽기 도구 또는 최종 답변허용 도구 실행인자·ACL·예산 검사추가 질문 · 보류범위·근거가 부족한 경우결과 검증스키마·근거·정책업무 초안 검토내용·대상·hash 확정근거 답변 완료질의 응답은 여기서 종료서버의 티켓 등록승인 payload · action key
모델은 등록안을 만들지만 create_task를 직접 호출하지 않는다. 추가 질문에 대한 답변은 새 run으로 이어지며 이전 run과 연결한다. 승인 후에는 모델을 다시 호출해 payload를 바꾸지 않는다.

3.24개 읽기 도구와 별도 쓰기 계약

도구·주체입력출력·제한실패
search_documents / 모델query ≤300자, top_k≤5허용 project·ACL·index snapshot 안의 문서 ID·revision·발췌검색 결과 없음은 정상 결과
read_document_segment / 모델document_id, revision_id, segment_id최대 4,000자·출처·evidence_id권한 또는 snapshot 불일치 시 거부
search_tasks / 모델query ≤300자, status?, limit≤10현재 프로젝트의 티켓 ID·상태·updated_at다른 프로젝트 ID 입력 금지
get_task / 모델task_id허용 프로젝트의 상세·revision·evidence_id없음·권한 없음은 구별 정보 제한
create_task / 반영 처리기승인된 project_id, title, body, assignee_id, due_at, action_keyticket_id, receipt, created_at타임아웃은 UNKNOWN, 같은 키로 결과 조회
모델에 주지 않는 권한tenant_id·사용자 역할·허용 프로젝트는 서버가 주입한다. 임의 URL·SQL·셸·전체 파일 경로·이메일 전송 도구는 제공하지 않는다. 문서 속 “이전 지시를 무시하라”는 문장은 검색 데이터로만 취급한다.

3.3구조화된 결과 계약

{
  "schema_version": "1",
  "outcome": "ANSWER_WITH_PROPOSAL",
  "answer": "QA 기록에서 모바일 첨부 업로드 검수 결과를 찾지 못했습니다.",
  "claims": [
    {
      "text": "모바일 첨부 업로드 검수 근거가 확인되지 않음",
      "evidence_ids": [
        "ev_spec_14",
        "ev_qa_08"
      ]
    }
  ],
  "uncertainties": [
    "검색 범위 밖 자료에 검수 기록이 있을 수 있음"
  ],
  "proposal": {
    "title": "모바일 첨부 업로드 검수",
    "body": "요구사항 UP-04에 대한 390px 화면의 업로드·오류 안내 검수",
    "project_id": "project_aurora",
    "assignee_id": null,
    "due_at": null
  }
}

가상 응답 예시. “검수 근거가 없다”와 “검수를 하지 않았다”를 구분한다. outcome은 ANSWER / ANSWER_WITH_PROPOSAL / NEEDS_INPUT / INSUFFICIENT_EVIDENCE 중 하나다.

검증조건위반 처리
근거 참조모든 evidence_id가 이 run의 읽기 도구 결과에 존재출력 수정 1회; 재실패 OUTPUT_INVALID
근거 의미인용 위치·hash 검사 + 실제 주장과의 일치 평가스키마 통과만으로 사실 확인을 완료했다고 간주하지 않음
업무 대상project_id는 요청 범위와 일치; 담당·기한은 검토 화면에서 확정누락 또는 권한 불일치 시 승인 불가
내용 변경payload의 정규화 JSON으로 hash 계산, revision 불변 저장수정 시 새 revision, 기존 승인 효력 종료
승인 만료기준안 24시간; 정책·권한·참조 문서 변경 시 재검토외부 등록 전에 다시 확인, 충돌 409

3.4세 가지 상태를 따로 표시한다

상태 축전이완료 의미
실행 runQUEUED → RUNNING → SUCCEEDED / FAILED / CANCELED; 대기 작업도 취소 가능SUCCEEDED는 유효한 답변 생성. outcome이 질문·근거 부족이어도 정상 종료 가능.
검토 proposal revisionPENDING → APPROVED / REJECTED; 새 revision은 다시 PENDING승인은 화면에 표시된 특정 payload의 승인
반영 executionPENDING → SENDING → APPLIED / FAILED / UNKNOWNAPPLIED만 외부 영수증으로 실제 등록 확인
미확정 복구UNKNOWN → 키 조회 → APPLIED 또는 확정 부재 후 PENDING3회 조회 후에도 불명확하면 UNKNOWN 유지·운영 조사. 새 키 등록 금지.
제한·장애구현 규칙
기본 예산run 전체 모델 6회·도구 16회·누적 입력 24,000 / 출력 4,000 tokens·실행 120초. queue 대기는 별도.
중단·취소취소 플래그 확인 후 새 호출 중지. 결과 저장과 취소는 CAS로 최종 상태 하나만 확정.
worker 복구lease 45초·heartbeat 10초; 재claim마다 fencing_token 증가. 이전 worker의 저장 거부. 총 attempts≤2.
재시도읽기 일시 오류 최대 1회; 출력 수정 1회; 모두 job 누적 예산·deadline에 포함. 권한 오류는 재시도 금지.
비용 예약호출 전에 최대 예상 비용 예약; usage로 정산. 응답 유실 시 예약액을 유지해 복구 중 예산을 중복 사용하지 않음.
외부 쓰기승인·권한·revision 확인 후 outbox 저장. action key 유지. 외부 멱등 계약이 없으면 자동 등록을 출시하지 않음.

4.1SCR-01 · 요청, 진행, 근거 답변

SCR-01 / 업무 지원 작업실화면 설계 예시 · 가상 데이터
01프로젝트 오로라작업 완료 · 답변 생성
02업무 요청
QA 문서와 요구사항을 비교해서 누락된 검수 항목을 찾아줘. 필요한 후속 티켓도 제안해줘.
04근거 답변

모바일 첨부 업로드의 검수 기록이 확인되지 않았습니다. 검수 누락 여부는 담당자 확인이 필요합니다.

05요구사항 v4 / UP-04
QA 기록 v7 / 첨부 파일 항목
원문 구간 보기 ↗
번호동작·상태서버 계약·검수
01 · 범위로그인 사용자가 접근 가능한 프로젝트만 선택. 선택 변경 시 이전 요청과 결과 구분FR-01 / API-01 / TC-02
02 · 접수요청 10~4,000자. 전송 중 중복 버튼 잠금; 서버는 Idempotency-Key로 중복 방지FR-02 / API-01 / TC-03
03 · 진행실제 단계 이벤트·최근 갱신 시각 표시. 임의 진행률 % 표시 금지. 3초 폴링, 숨긴 탭은 중지FR-08 / API-03·04·05 / TC-07
04 · 결과답변·근거 부족·추가 질문을 구분. 실패를 빈 답변처럼 표시하지 않음FR-05 / API-06 / TC-01·04
05 · 근거원문 revision·문단·인용 표시. 현재 권한이 없으면 본문·파일 URL 숨김FR-09 / API-07 / TC-02·05
06 · 초안proposal이 있을 때만 검토 진입. 답변만 있는 경우 최종 결과로 종료FR-06 / API-09 / TC-06

4.2SCR-02 · 실행할 내용 자체를 검토한다

SCR-02 / 업무 등록안 검토화면 설계 예시 · 가상 데이터
01티켓 등록안revision 2
프로젝트프로젝트 오로라
02제목모바일 첨부 업로드 검수
담당·기한지정된 검토 담당자 / 2026.09.24
03근거요구사항 v4 / QA 기록 v7
04승인 대상이 화면의 제목·설명·담당·기한으로 티켓 1개를 생성합니다. 수정하면 새 revision으로 다시 검토합니다.
번호입력·동작 규칙오류·검수
01 · 버전proposal_id·revision·payload_hash 표시. 승인 API는 세 값의 일치를 확인이미 수정·검토됐으면 409; 새 내용 재조회
02 · 수정제목 5~120자, 설명 20~4,000자, 허용 담당자, ISO 기한. 수정 저장은 새 revision 생성API-08; 승인된 revision을 덮어쓰지 않음
03 · 근거검토자가 근거 원문과 최신성 확인. 변경 문서·권한 회수 시 재검토 안내TC-05; 등록 직전 서버도 현재 권한·revision 재검사
04 · 결정검토자 역할만 승인·반려. 반려 사유 10~1,000자. 자기 승인 허용 여부는 조직 정책으로 확정API-10; 동시 결정은 1개만 저장
05 · 등록승인과 등록은 두 동작. 같은 revision의 기존 execution이 있으면 재사용API-11·12; UNKNOWN일 때 새 등록 버튼 금지

4.3SCR-03 · 실행 이력과 운영 조사

SCR-03 / 실행 이력화면 설계 예시 · 가상 데이터
01실행 기록프로젝트 · 상태 · 날짜
작업실행검토반영
RUN-1042 · QA 누락 조사완료승인등록 완료
RUN-1043 · 정책 질의완료대상 없음대상 없음
RUN-1044 · 개선 업무완료승인02확인 중
03RUN-1044 / 반영 결과 확인 중

외부 시스템의 응답이 끊겼습니다. 동일 등록 키로 티켓 존재 여부를 확인하고 있습니다.

action key: act_1044_r1
최근 확인 15:42:03 · 재등록 대신 결과 조회
번호표시·권한연결
01 · 목록본인·허용 프로젝트의 작업만. 필터는 URL query 유지; cursor 20개씩API-02 / FR-01·09
02 · 상태실행·검토·반영을 별도 열로 표시. UNKNOWN을 실패 또는 성공으로 단정하지 않음API-12 / FR-07
03 · 조사action key·확인 시각·영수증 표시. 운영자의 직접 새 키 재전송은 금지TC-08·09 / FR-12
04 · 기록단계·오류 코드·사용량 등 메타데이터. 운영자에게 원문 권한을 자동 부여하지 않음API-04 / FR-10

4.4화면 공통 규칙

상태UI 규칙
로딩·빈 결과마지막 데이터와 갱신 시각 유지. 아직 결과가 없으면 대기 상태와 취소 동작 제공.
권한 없음다른 조직 ID의 존재·제목·근거를 노출하지 않음. 민감 대상은 404로 통일.
통신 오류작성 중 요청·반려 사유 보존. 재전송은 기존 요청 키 사용.
모바일390px에서 좌우 패널을 상하 배치. 표·구조도만 내부 가로 스크롤.
접근성모든 실제 버튼·링크 키보드 접근, 포커스 표시, modal 포커스 복원, 오류와 입력 연결.
긴 실행백그라운드 탭 폴링 중지. 돌아오면 현재 상태 다시 조회. 서버 작업은 화면 종료와 무관하게 지속.

4.5HTTP API 계약 · /api/v1

ID · 메서드경로·핵심 요청결과·조건
API-01 · POST/runs · request, project_id, parent_run_id? + Idempotency-Key202 새 run / 200 같은 요청 재사용. tenant는 세션에서 결정.
API-02 · GET/runs · project_id?, status?, cursor?, limit≤20허용 범위 items,next_cursor. 최신 요청 순.
API-03 · GET/runs/:idstatus,stage,result_id?,proposal_id?,cancel_requested,version
API-04 · GET/runs/:id/events · after_seq, limit≤100events,last_seq,has_more. 원문·비밀 키 제외.
API-05 · POST/runs/:id/cancel · expected_version202 취소 요청 / 200 이미 취소 / 409 다른 종료 상태
API-06 · GET/results/:idanswer,claims,evidence_ids,uncertainties,proposal_id?
API-07 · GET/evidence/:id문서·revision·구간·원문. 현재 ACL 재확인.
API-08 · POST/proposals/:id/revisions · base_revision,payload + Idempotency-Key201 새 revision / 기존 revision 충돌 409. SENDING·UNKNOWN 동안 수정 금지.
API-09 · GET/proposals/:idcurrent_revision,payload,payload_hash,decision,expires_at
API-10 · POST/proposals/:id/decisions · revision,payload_hash,decision,reason + Idempotency-Key201 결정 / 동일 키 200 / 버전·기존 결정 충돌 409
API-11 · POST/proposals/:id/executions · revision,payload_hash + Idempotency-Key202 등록 대기 / 200 기존 실행. 승인·만료·권한·근거 버전 검사.
API-12 · GET/executions/:idstatus,action_key,receipt?,last_error_code,checked_at
WRITE REQUEST

API-10 · 승인

{
  "revision": 2,
  "payload_hash": "sha256:…",
  "decision": "APPROVED",
  "reason": "근거와 담당자·기한을 확인함"
}
ERROR CONTRACT

공통 충돌 응답

{
  "error": {
    "code": "PROPOSAL_REVISION_CONFLICT",
    "message": "등록안이 변경되었습니다.",
    "retryable": false
  },
  "trace_id": "trace_1042"
}
공통 API 규칙로그인은 same-origin 보안 세션 쿠키, 쓰기 요청에는 CSRF 검증을 적용한다. 요청 키는 tenant·actor·route 범위에서 24시간 보존하며 payload hash가 다르면 409다. 401 세션 만료 / 403 역할 부족 / 404 비공개 대상 / 409 충돌 / 422 입력 오류 / 429 제한 / 503 의존 서비스 장애로 구분한다.

5.1책임이 분리된 모듈 구조

웹·API·worker가 공유하는 업무 계약FIG. 04
웹·API·worker가 공유하는 업무 계약라우트에서 모델을 직접 실행하지 않는다. API는 요청을 저장하고 반환하며, worker가 동일한 domain 정책을 사용해 비동기 처리한다.HTTP업무 검증영속 상태동일 정책외부 경계버전 고정회귀 검증web/workbench · review · runsapi/routes · auth · validatorsdomain/Run · Proposal · Executionrepositories/MySQL · transactionsworker/claim · runner · publisheradapters/LLM · documents · tasksevals/fixtures · 평가 · reportscontracts/JSON Schema · policy
라우트에서 모델을 직접 실행하지 않는다. API는 요청을 저장하고 반환하며, worker가 동일한 domain 정책을 사용해 비동기 처리한다.
모듈책임완료 기준
RunService요청·권한 검증, 멱등 키, run 접수·취소중복 요청·취소 경합 테스트
AgentRunnercontext 구성, 모델/도구 반복, 예산, checkpoint제한 초과·재시작 후 카운터 유지
ToolRegistryJSON Schema 검증, 허용 도구와 범위 주입범위 밖 인자·지시 주입으로 권한 확대 불가
EvidenceValidator근거 ID·문서 revision·인용 hash 확인없는 근거 참조·다른 run의 근거 거부
ProposalService불변 revision, payload 정규화·hash, 검토 결정변경안의 재승인·동시 결정 하나만 저장
ExecutionPublisher승인 확인, Outbox claim, 멱등 등록·조회성공 후 타임아웃에도 외부 티켓 1개
AuditRepository행위·상태·버전·사용량 기록추적 가능하며 비밀 키·원문 로그 없음

5.2서버에서 강제할 두 개의 트랜잭션

TRANSACTION A

결과를 완성한다

근거·출력 검증 → result와 근거 관계 저장 → 필요 시 proposal revision 1 생성 → run SUCCEEDED. 전부 성공하거나 전부 롤백한다.

TRANSACTION B

등록할 내용을 고정한다

현재 proposal row 잠금 → 승인·revision·hash·유효기간 확인 → execution/outbox 생성 → audit. 외부 HTTP 호출은 commit 뒤 수행한다.

async function publish(executionId) {
  const action = await claimExecution(executionId);
  await recheckAccessAndApproval(action);
  // 저장된 승인 payload만 사용. 모델 재호출 없음.
  try {
    const receipt = await taskAdapter.create({
      payload: action.approvedPayload,
      idempotencyKey: action.actionKey
    });
    await markApplied(action, receipt);
  } catch (error) {
    // 전송 여부를 확정할 수 없으면 실패로 단정하지 않음.
    await recordFailureOrUnknown(action, error);
  }
}

설계 의사 코드. 실제 구현은 claim lease·fencing, 외부 오류 분류, 만료·권한 재검사, UNKNOWN 조회 복구를 포함해야 한다.

5.3단계별 개발 티켓

M1

계약과 데이터

권한·문서 버전·외부 멱등 계약을 먼저 검증

M2

끝까지 이어지는 기능

요청 → 읽기 → 근거 답변을 실제 자료로 연결

M3

승인과 등록

검토 화면 → Outbox → 외부 영수증

M4

평가와 인수

장애·권한·복원까지 확인 후 운영 전환

티켓 · 담당작업·산출물선행 조건인수
DEV-01 · 기획/연동프로젝트 브리프·권한표·INT-01~04 계약과 샘플 응답착수외부 능력 확인·제외 범위 확정
DEV-02 · 백엔드DB migration·tenant FK·세션·멱등 저장DEV-01TC-02·03
DEV-03 · 도메인/QA문서 fixture·정답·권한 매트릭스·평가 세트DEV-01정답 검토자 서명·hash 고정
DEV-04 · 백엔드자료 snapshot·4개 읽기 도구·검색 ACLDEV-02TC-02·04·05
DEV-05 · AI/백엔드provider adapter·runner·budget·lease·결과 검증DEV-03·04TC-01·04·07·10
DEV-06 · 프런트SCR-01·03 요청·상태·근거·이력, API-01~07DEV-02·05TC-01·11
DEV-07 · 풀스택SCR-02 수정·승인·충돌, API-08~10DEV-05·06TC-05·06
DEV-08 · 연동/백엔드API-11·12·Outbox·멱등 생성·결과 조회DEV-01·07TC-08·09
DEV-09 · QA/도메인고정 세트 반복 평가·보안·경합·장애 검수DEV-03~08모든 P0 gate
DEV-10 · 운영경보·중단·복원·만료 삭제·배포 runbookDEV-08·09TC-12·인수 기록
일정 산정 방식자료·외부 API 계약이 확정된 후 DEV 티켓별 구현·검수·연동 대기 시간을 추정한다. 팀 규모를 모른 채 확정 주차를 약속하지 않는다. 완료율은 작성한 코드 양이 아니라 각 티켓의 인수 증거로 판단한다.

5.4AI 개발자에게 전달할 작업 카드

작업 ID: DEV-07
목표: 승인 대상과 실제 등록 payload가 항상 일치한다.
변경 범위: ProposalService, API-08~10, SCR-02
입력: proposal_id, base_revision, payload, actor context
규칙: 수정은 새 revision / 승인 승계 금지 / tenant 서버 주입
실패: 409 버전 충돌 / 403 역할 부족 / 422 입력 오류
금지: 모델에게 승인 권한 부여, 승인 payload 덮어쓰기
검증: TC-05, TC-06 / 경합 결과와 DB 행 수 첨부
제출: 변경 코드, migration 여부, API 예시, 검수 증거, 남은 제약

5.5인수할 파일 묶음

산출물필수 내용
개발기획서·화면 명세FR·SCR·API·TC ID, 문서 버전, 변경 이력, 미확정 사항
소스·배포 설정실행 방법, 서버 secret 목록, dependency lock, rollback 경로
DB·API 계약migration·복원 절차, JSON Schema, 요청·응답·에러 예시
에이전트 패키지프롬프트·도구·모델·정책 버전, 예산·종료 규칙
QA·평가 보고서fixture hash, 결과·실패 분석, 증거 캡처·로그, 재검수 결과
운영 runbook경보, 일시 중단, UNKNOWN 조사, 백업 복원, 보관·삭제

6.1요구사항에 연결된 12개 인수 시나리오

ID · 요구사항입력·상황기대 결과제출 증거
TC-01 · FR-05·09명확한 정답·근거가 있는 QA 요청SUCCEEDED, 출처가 주장에 연결, proposal은 근거와 일치입력·결과 JSON·근거 화면
TC-02 · FR-01·04다른 조직 ID·회수된 문서 권한·범위 밖 도구 요청읽기·근거·결과·등록 모두 차단; 자료 존재도 비노출역할별 요청·응답·도구 기록
TC-03 · FR-02같은 요청 키로 동시에 10회 전송, 이어서 다른 본문 전송run 1개; 다른 본문은 409요청 키 hash·DB count
TC-04 · FR-04·05지시 주입 문서·없는 근거 ID·상충 자료권한 확대 없음; 잘못된 출력 수정 1회; 부족하면 질문·보류fixture·검증 오류·최종 outcome
TC-05 · FR-03·06승인 후 문서·정책·담당 권한 변경 또는 초안 수정변경된 내용은 재검토; 이전 승인으로 등록 불가revision·hash·409/403 기록
TC-06 · FR-06두 검토자가 같은 revision을 동시에 승인·반려결정 하나만 저장. 같은 요청 재전송은 결과 재사용결정 행 수·동시 요청 로그
TC-07 · FR-08반복 도구 요청·deadline 초과·완료 직전 취소run 예산 내 종료; 취소/완료 중 하나만 확정카운터·시간선·최종 상태
TC-08 · FR-07등록 성공 직후 응답 유실UNKNOWN → action key 조회 → APPLIED; 티켓 1개외부 영수증·호출 횟수
TC-09 · FR-07같은 등록 요청 10회, UNKNOWN 중 재클릭execution 1개; 새 action key 생성 없음outbox unique·외부 티켓 수
TC-10 · FR-08·10worker 종료·lease 만료·이전 worker 복귀새 fencing_token만 쓰기 가능; 누적 예산 유지claim·checkpoint·거부 이벤트
TC-11 · FR-09키보드·390px·통신 오류·숨긴 탭 복귀근거 탐색·입력 보존·포커스 복원·현재 상태 갱신화면 캡처·접근성 QA
TC-12 · FR-10·11·12평가 회귀·운영 중지·백업 복원·만료 삭제gate 통과; 신규 claim 0; 복원 hash 일치; 만료 자료 접근 불가평가표·복원 기록·감사·삭제 증거

6.2평가를 세 층으로 나눈다

답변 품질·실행 경로·업무 효과는 서로 다른 평가다FIG. 05
답변 품질·실행 경로·업무 효과는 서로 다른 평가다좋은 답변만으로 무승인 쓰기나 권한 누출을 상쇄할 수 없다. 보안·승인·중복 관련 실패는 품질 평균과 분리한 출시 차단 조건이다.고정 평가 입력자료·권한·정답·버전결과 평가정확성 · 근거 · 보류경로 평가도구 · 범위 · 예산업무 효과 평가승인 일치 · 중복 없음출시 gate세 층 모두 기준 충족
좋은 답변만으로 무승인 쓰기나 권한 누출을 상쇄할 수 없다. 보안·승인·중복 관련 실패는 품질 평균과 분리한 출시 차단 조건이다.
평가 항목기준안
고정 세트 60건정상 답변 20 / 근거 부족·상충 10 / 지시 주입 10 / 권한 경계 10 / 승인·외부 장애 10
반복·분모각 3회, 총 180회. 답변 적합률은 정상·부족 사례 30×3=90회 중 ≥86회 적합. 나머지는 정책 gate로 별도 집계.
정답 검수도메인 담당자 2인이 답변·근거·허용 행동을 합의. 모델 grader는 보조이며 단독 인수 판정 금지.
데이터 분리개발용 세트와 held-out 인수 세트 분리. 실패를 수정한 뒤 인수 세트에만 맞추지 않도록 새 표본 추가.
출시 차단관측한 교차 조직 누출·무승인 등록·중복 티켓·위험한 허위 단정이 하나라도 있으면 출시 보류.
변경 후 재검수모델·프롬프트·도구 스키마·권한 정책·검색 방식 변경마다 해당 gate 회귀 평가.

6.3실제로 제출할 QA 결과 형식

필드작성 예시 · 가상 사례
문서·대상QA-RUN-014 / TC-08 / build abc123 / model·policy 버전
입력·사전 조건승인 proposal rev2, 외부 생성 성공 후 응답 유실 fixture
재현 절차등록 요청 → 응답 유실 주입 → 상태 조회 → action key 조사
기대 / 실제기대: UNKNOWN→APPLIED, 티켓 1개 / 실제: 테스트 수행 후 기록
증거UI 캡처, redacted HTTP 응답, outbox 행, 외부 영수증 링크
결함·조치심각도 / issue ID / 원인 / 변경 사항 / 영향 API
재검수·인수수정 버전 / 재검수 결과 / 검수자 / 인수 일시

6.4운영 기준과 비용 산정

항목초기 운영안 · 합의 후 확정
동시성·대기전체 worker 2개·조직당 1개; queue 상한 100. 초과 429 + Retry-After; 조직별 공정 claim.
관측·알림queue age, run 실패율, 근거 부족률, 토큰·비용, UNKNOWN 등록 수. queue 5분·UNKNOWN 3회 미확정 시 알림.
비용run 비용 = 입력 tokens×입력 단가 + 출력 tokens×출력 단가 + 도구·검색 비용. 단가는 선택 모델의 확인일과 함께 별도 설정.
월 예산예상 월 비용 = 월 run 수×실측 평균 run 비용 + 저장·검색·서버. 평균과 P95를 분리해 예산 상한 결정.
로그·보관메타데이터 중심 로그. 임시 추출 24h / 결과·근거 snapshot 90일 / 감사 180일 제안. 업무 계약에 맞춰 확정.
백업·복원일일 암호화 백업, RPO 24h·RTO 4h 목표. 격리 복원과 외부 영수증 대조로 실제 달성 여부 확인.
키·파일서버 secret으로 모델·연동 키 관리. 원문 비공개 저장, 다운로드마다 현재 ACL 검사.

6.5장애 발생 시 행동과 출시 판단

상황즉시 행동재개 조건
모델·도구 오류 급증신규 run·claim 일시 중단, 버전·오류 분류고정 세트와 샘플 run 확인
권한·자료 누출 의심영향 자료 접근 차단, trace로 범위 확인정책 수정·영향 조사·권한 테스트 통과
등록 여부 불명확해당 execution UNKNOWN 유지, 같은 action key 결과 조회영수증 확인 또는 확정 부재. 새 키 생성으로 해결 금지.
worker 장애lease 만료 후 제한된 재claim, 누적 예산 유지fencing·checkpoint 검증
rollback·복원이전 검증 버전 복구, DB 읽기 호환·outbox 상태 확인이미 등록된 티켓 재생성 없음·복원 hash 일치
출시 완료 조건TC-01~12 통과, 품질·정책 gate 충족, INT-01~04 검증, 치명·높음 결함 0, 운영 복원 증거, 업무 책임자의 인수 기록이 모두 필요하다. 이 문서는 수행할 검수 기준이며 테스트 통과 보고서가 아니다.

6.6착수 전에 담당자가 확정할 결정

미확정 항목현재 제안결정 책임·시점
첫 적용 업무·자료한 프로젝트의 QA 누락 조사제품 책임자 / M1
승인 권한·자기 승인검토자 역할 필요, 자기 승인 여부는 조직 정책업무 책임자 / M1
자료·티켓 연동revision·ACL·action key·결과 조회 계약연동 담당자 / M1
모델·사용 데이터 조건adapter 사용, 평가 통과 모델·버전 고정보안·AI 담당자 / M2 전
예산·보관·SLA문서의 초기값을 실제 표본으로 측정·조정운영 책임자 / M4 전

설계 근거와 적용 범위

공식 자료의 원칙을 적용한 자체 개발안이다. 아래 API·제한값·화면·인수 조건은 제품의 공식 사양이 아니다. 화면은 가상 데이터로 만든 설계 예시이며, 이 사이트가 실제 사내 자료를 검색하거나 티켓을 생성하지는 않는다. 공식 문서 확인: 2026.09.20.

Anthropic · Building effective agents ↗

고정 워크플로와 에이전트의 구분, 단순한 구조에서 시작하는 원칙.

Anthropic · Writing tools for agents ↗

도구의 목적·입출력 설계와 실제 작업을 통한 평가.

OpenAI · Human-in-the-loop ↗

사람의 승인과 실행 재개를 다루는 공식 구현 참고.

OpenAI · Tracing ↗

실행 기록과 도구 호출을 관측하는 공식 구현 참고.