# 정책 설정 가이드

## 설정할 항목

| 항목 | 참가자 입력 | 실제 제한 |
| --- | --- | --- |
| 지갑 | name | 해당 소유자 아래의 정확한 이름 |
| 수신자 | recipient | 주소 한 개를 고정 |
| 목적 | purpose | 사람이 읽을 설명, 실행 조건은 아님 |
| 횟수 | maxCalls | 1 또는 2 |
| 회당 금액 | 변경 불가 | 0.1 테스트 OKRW |
| 기간 | 변경 불가 | 승인 요청 준비 기준1시간 |
| 호출 데이터 | 변경 불가 | 빈 calldata의 native 송금 |

주최자가 지정한 수신자 주소를 사용하세요. 에이전트가 임의 주소를 만들거나 사용자 요청과 다른 금액·기간으로 바꾸면 안 돼요. 현재 지원하지 않는 조건은 불가능하다고 설명해야 해요.

## 예시

작업 1건에 0.1을 한 번만 지급하려면 maxCalls=1이에요. 작업 2건에 각각 0.1씩 지급하려면 maxCalls=2예요. "매일1만원", "0.05씩10번", "언제든모든주소로송금"은 현재 기본판이 제공하지 않는 정책이에요.

```sh
npm run policy:preview -- --name my-agent --recipient 0x9a8f75E2e57DA3Ed3Fc0b26858C3205D216cE672 --max-calls 1 --purpose "작업 완료 보상" --json
```

MCP에서도 같은 입력으로 policy_preview를 호출하세요. preview는 로그인·키·서명·네트워크 없이 예상 제한만 보여줘요. 실제 정책을 요청할 때는 같은 필드에 고정 requestId를 추가해 policy_request를 사용하세요. preview 결과 자체는 승인·정책ID·실행권한이 아니에요.

## 승인과 실행

1. policy_request는 정확한 정책의 소유자 승인을 요청해요.
2. 반환된 approvalUrl에서 소유자가 내용을 확인해 승인해요.
3. 원래 requestId의 operation_status에서 policyState=enabled를 확인해요.
4. policyId와 새 실행용 requestId로 wallet_execute를 호출해요.
5. 실행이 succeeded이고 실제 transactionHash가 있는지 확인해요. pending·unknown은 성공이 아니에요.

동일 실행은 같은 requestId를 유지하세요. 목적이 다른 작업에 기존ID를 재사용하지 마세요. 응답이 유실되면 새ID로 보내지 말고 원래 작업을 조회하세요.

## 부모와 자식의 금액

실제 0.1은 자식 월렛이 보내요. 부모 Pouchi 지갑은 Registry.executeAgent를 value=0으로 호출하고, 그 calldata 안의 수신자·0.1·빈데이터가 정책 predicates로 고정돼요. 따라서 부모 maxValuePerCall/valueAllowance가0이어도 자식은0.1을 지출해요. 자식의 총지출은 0.1 × 허용횟수로 제한해요. 이 구조를 모든 토큰에 적용되는 범용 누적 예산 엔진이라고 설명하면 안 돼요.

## 중단과 회수

동결은 자식 실행을 멈추고, 철회는 해당 정책을 막아요. 회수는 자식 자금을 소유자 부모로 돌려주는 별도 작업이에요. 지출 정책에는 생성·충전·동결·회수 권한이 없어요. 각 관리 요청은 1회용 별도 승인이고, 동결 중 회수는 가능해요. 모든 승인 대기를 완료로 보고하면 안 돼요.

첫 거래 후 자식 잔액은 0.2이고, 기본 2회 정책이면 사용하지 않은 1회 권한이 남아요. 실습 종료 시 동결·회수·철회 결과를 확인하세요. 자세한 명령은 walkthrough.md에 있어요.

## 첫 실습의 재개 기록

first-transaction 안내는 한 상태 경로에서 같은 이름·수신자의 첫 거래를 재개하는 용도예요. 입력을 바꾸면 중복 지급을 피하려고 충돌로 막아요. 다른 지갑 실습은 새 폴더를 사용하거나 MCP의 개별 관리 도구로 명시적으로 요청하세요. 기존 .local을 삭제해 강제로 다시 시작하지 마세요.
