소개
프로젝트 어시스턴트는 동료가 계획 문서를 읽도록 돕습니다. 어시스턴트는 documents.read 같은 구조화된 요청인 도구 호출을 제안합니다. Tool Server가 작업을 실행합니다. 그럴듯한 제안이 실행 권한을 주지는 않습니다.
합성 데이터를 사용하는 교육 서비스를 유지 관리합니다. 정상 읽기를 먼저 확인한 뒤 작은 정책 편집 두 번으로 불필요한 쓰기·삭제 권한을 제거합니다. 제안은 실시간 모델 응답이 아닌 결정적 재생입니다. 인증, 서버 판단, 문서 작업은 실제로 수행됩니다. 이 실습은 프롬프트 주입 내성을 시험하지 않습니다.
설정 관리에는 Policy Editor, 인증 요청에는 Test Client, 재생 페이지에는 Assistant Tool Lab을 사용합니다. 두 터미널은 같은 인스턴스의 서로 다른 운영체제 사용자입니다. Policy Editor에는 의도적으로 관리 권한이 있고, Test Client는 정책을 편집하거나 sudo를 사용할 수 없습니다. 기본 터미널 사용법만 알면 됩니다.
읽기를 유지하고 쓰기 제거
이 단계에서는 정상 문서 읽기를 관찰한 뒤 어시스턴트의 쓰기 권한을 제거합니다.
이 단계를 시작하려면 실습 인터페이스에서 Assistant Tool Lab 탭을 선택합니다.
교육 계정은 alice와 bob입니다. 주체는 인증으로 확정된 사용자 신원입니다. 각 계정에는 도구 권한을 묶는 assistant 역할이 있습니다. 문서는 합성 데이터입니다. alice-notes는 Alice, bob-notes는 Bob의 것이며 Bob은 team-plan을 Alice와 공유합니다. 폐기 가능한 시연에는 demo-pad만 사용합니다.
Assistant Tool Lab 탭으로 전환합니다. alice를 선택하고 비밀번호 training-alice를 입력한 후 Sign in을 클릭합니다. 도구는 documents.read, 문서는 alice-notes로 두고 Replay proposal을 클릭합니다. 추적 정보는 신뢰할 수 없는 제안과 서버 결과를 구분합니다. HTTP 200, principal alice, decision allowed, Synthetic Alice planning notes가 예상됩니다. 실제 문서 읽기입니다.

Test Client 탭으로 전환합니다. 준비된 assistant 명령은 인증된 계정으로 HTTP 요청을 보냅니다. replay는 재실행 경로로 제안을 제출하고 call은 도구 처리 함수를 직접 호출합니다. 다음 두 단어는 도구와 문서 이름입니다. 실행합니다.
다음 명령을 실행하기 전에 Test Client 탭으로 전환합니다.
assistant replay documents.read team-plan
HTTP 200과 Synthetic shared project plan을 기대합니다. 이제 폐기 가능한 문서에만 과도한 권한을 시연합니다.
assistant replay documents.write demo-pad
HTTP 200과 "effect": "written"을 기대합니다. 서버가 이 시연 문서를 실제로 바꿨습니다. 읽기 전용 업무 역할은 이 작업을 할 수 없어야 합니다.
Policy Editor 탭으로 전환합니다. cat은 파일을 출력하며 이 절대 경로는 적용 중인 도구 허용 목록을 가리킵니다.
다음 명령을 실행하기 전에 Policy Editor 탭으로 전환합니다.
cat /home/labex/project/tools.json
JSON은 이름과 값을 따옴표로 감싸고 그 사이에 콜론을, 목록에는 대괄호를 사용합니다. assistant 목록에는 현재 읽기, 쓰기, 삭제가 있습니다. 메뉴 항목만 없애면 직접 요청은 여전히 가능합니다. 서버는 요청마다 처리기 가드 안에서 이 목록을 읽습니다.
다음 중간 정책으로 파일을 교체합니다. cat > path는 출력 대신 텍스트를 씁니다. 따옴표로 감싼 EOF는 내용을 문자 그대로 다루는 here-document를 시작하고, 마지막 EOF는 단독 줄이어야 합니다. 작은 파일 전체를 바꾸므로 다시 실행하면 오타를 복구할 수 있습니다.
cat > /home/labex/project/tools.json <<'EOF'
{
"assistant": ["documents.read", "documents.delete"]
}
EOF
Test Client 탭으로 돌아가 쓰기 제안을 반복합니다.
다음 명령을 실행하기 전에 Test Client 탭으로 전환합니다.
assistant replay documents.write demo-pad
HTTP 403과 tool_denied가 예상됩니다. 403 응답은 서비스가 요청을 받아 거부했다는 뜻이며 연결 오류는 결정 지점에 도달하지 못했다는 뜻입니다. CLI는 의도적인 거부를 출력해도 셸을 종료하지 않습니다. policy_error가 보이면 Policy Editor 탭으로 전환하여 전체 JSON 편집을 반복한 후 Test Client 탭으로 돌아가 요청을 재시도합니다. 재시작은 필요 없습니다.
assistant call documents.read alice-notes
읽기는 여전히 HTTP 200을 반환해야 합니다. 체크포인트는 인증된 두 사용자의 쓰기 거부와 정상 읽기를 시험하며 출력 복사를 요구하지 않습니다.
직접 삭제 경로 닫기
이 단계에서는 읽기 전용 역할을 완성하고 직접 처리기와 재생을 모두 시험합니다.
이 단계를 시작하려면 실습 인터페이스에서 Policy Editor 탭을 선택합니다.
삭제는 별도 작업입니다. 쓰기를 막아도 삭제가 자동으로 차단되지는 않습니다. Policy Editor 탭으로 전환합니다. 이 역할에 필요한 하나의 작업만 목록에 남깁니다. 같은 전체 파일 편집 방식을 사용합니다.
다음 명령을 실행하기 전에 Policy Editor 탭으로 전환합니다.
cat > /home/labex/project/tools.json <<'EOF'
{
"assistant": ["documents.read"]
}
EOF
Test Client 탭으로 전환합니다. 일회용 메모에 직접 삭제 요청을 보냅니다.
다음 명령을 실행하기 전에 Test Client 탭으로 전환합니다.
assistant call documents.delete demo-pad
HTTP 403과 tool_denied를 기대합니다. call은 재생 페이지를 우회하므로 보이는 인터페이스가 권한 적용 경계가 아님을 확인합니다. 직접 쓰기도 시험하세요.
assistant call documents.write demo-pad
동일한 거부를 기대합니다. Alice가 합법적으로 공유된 문서를 여전히 읽는지 확인합니다.
assistant call documents.read team-plan
HTTP 200과 Synthetic shared project plan이 예상됩니다. Assistant Tool Lab 탭으로 전환합니다. Alice의 로그인 상태를 유지한 채 documents.delete를 선택하고 demo-pad를 입력한 후 Replay proposal을 클릭합니다. 여기서도 서버가 tool_denied로 거부해야 합니다.

“읽기만 하세요” 같은 프롬프트는 이 가드를 대체하지 못합니다. 백엔드는 제안과 독립적으로 판단해야 합니다. 모든 도구를 끄면 어시스턴트의 유용한 업무도 깨집니다. 읽기가 거부되면 JSON 목록에서 documents.read 철자를 확인하세요. 체크포인트는 폐기 가능한 메모리 문서로 동일한 쓰기·삭제 처리기 가드를 호출하고 실제 허용 읽기를 검사합니다. 학습자 문서를 삭제하지 않습니다.
읽기 도구는 여전히 다른 사용자의 비공개 객체를 요청할 수 있습니다. 다음 실습에서 별도의 문서 경계를 추가합니다.
요약
정상 읽기를 유지하며 쓰기와 삭제 권한을 제거했습니다. 재생 제안과 직접 호출이 이제 같은 실제 서버 가드를 통과합니다. 도구 권한은 경계 하나입니다. 허용된 읽기에도 문서별 판단이 필요합니다.



