에이전트가 쓰기 편한 프로그램을 만들겠다는 목표는 무엇이든 실행하는 구멍을 크게 만드는 일과 달랐다. 필요한 기능을 찾고 정확한 대상을 고르고 이미 실행한 일을 확인할 수 있어야 했다. 북극성의 도구 계약을 다시 읽으며 편의가 어디에서 오고 어떤 실행은 별도의 신뢰를 요구하는지 정리했다.

행동마다 필요한 입력만 계약으로 받는다

ToolCall은 tool 값을 기준으로 서로 다른 strict schema를 사용한다. 파일 설명은 ID 목록, 업로드는 관찰 참조와 fileIds, 결과 확인은 tabId와 제한된 대기 시간을 받는다. 같은 문자열 칸에 경로와 스크립트와 의도를 모두 넣고 해석하는 형태가 아니다.

단위 시험에는 browser.evaluate와 임의 경로의 artifact.write를 공개 ToolCall로 넣으면 거절하는 예가 있다. 시험 제목만 보고 모든 프로그램에 JavaScript나 파일 쓰기가 없다고 결론내리지는 않는다. 여기서 닫아 둔 것은 이 브라우저 행동 계약의 임의 실행 입구다. 다른 기능의 실제 권한은 그 기능의 계약과 실행기를 따로 읽어야 한다.

한 번 발견한 기능을 계속 다시 만들지 않는다

현재 외부 제어 흐름은 context를 확인한 뒤 활성 플러그인을 list·inspect하고 맞는 것이 있으면 재사용하도록 구성돼 있다. run은 기존 Python 또는 notebook 실행기를 시작하고 실행 번호를 반환한다. status로 그 실행을 확인한다. 새 모델 판단을 앱 안에 상시 배치하는 구조와 구분했다.

도구 목록도 필요한 family를 확장해 읽는다. 모든 상세 정의를 매 요청에 통째로 넘기지 않아도 입력 계약을 찾을 수 있다. 이 편의는 무제한 권한이 아니라 검색 가능한 기능, 명확한 입력과 안정된 실행 번호에서 나온다. 실행 응답이 돌아왔다는 사실과 업무 결과가 검증됐다는 사실은 그대로 나눠 둔다.

관찰 참조에는 어느 작업이 소유하는지도 따라온다

브라우저 행동은 ActionBroker를 거치며 탭의 owner·profileId·workspaceId와 주소 범위를 검사한다. 실행 세대가 바뀌었거나 running 상태가 아니면 거절한다. 페이지를 읽었다는 사실만으로 아무 탭에나 쓰는 권한이 생기지 않는다. ref가 정확해도 현재 작업의 소유 관계를 통과해야 한다.

따라서 실패가 났을 때 계약 밖의 raw CDP나 임의 JS를 새 도구처럼 열어 우회하는 것을 해결책으로 설명하지 않았다. 내부 구현이 고정 함수로 DOM을 읽는 일과 호출자가 원하는 코드를 넘기는 공개 기능은 다르다. 편의를 높이는 변경도 원래 어떤 검증을 거쳤는지 잃지 않는 방향으로 해야 한다.

Python 실행의 권한은 숨기지 않는다

외부 MCP에는 기존 프로젝트 노트북을 읽고 저장하고 실행하고 멈추는 기능도 있다. 문서는 Python 실행이 사용자의 로컬 권한을 유지한다고 명시한다. 이것을 임의 웹페이지가 마음대로 호출하는 안전 샌드박스라고 부를 수 없다. 신뢰한 프로그램과 사용자가 요청한 실행을 위한 별도 경계다.

공개 브라우저 API에 generic shell 메서드가 없다는 설명을 Python이 셸이나 파일에 전혀 닿을 수 없다는 뜻으로 넓히면 틀린다. 에이전트가 기존 사용자 셀을 보존하고 요청 범위를 지켜야 하는 이유도 여기에 있다. 무엇이 구조로 제한되고 무엇이 신뢰된 코드 실행인지 밝혀야 사용자가 프로그램을 올바르게 다룰 수 있다.

편하게 쓰는 도구는 불확실한 결과도 읽을 수 있다

연결이 끊겼다고 이전 행동을 못 보냈다고 가정하지 않는다. 실행 번호와 현재 문맥을 읽고 결과가 불확실하면 확인 경로를 사용한다. 현재 제품에서 새 AI 판단은 연결된 외부 대화가 맡고 앱은 실행과 상태를 유지한다. 오래된 내장 수리 기능을 지금도 돌아가는 편의로 소개하지 않았다.

이 글은 현재 계약과 문서, 거절 시험을 대조한 설명이며 새 외부 모델이나 운영 프로그램을 호출한 검수가 아니다. 재사용할 기준은 기능 발견, 정확한 대상, 신뢰 수준과 결과의 근거를 한 흐름에서 읽게 하는 것이다. 권한을 늘리지 않고도 실패 이유와 다음 확인을 명료하게 만들면 에이전트와 사람 모두의 작업이 쉬워진다.