← vox.aiCONTENT HISTORY
WHAT CHANGED
Update to vox.ai
Snapshot Nov 6, 2026 · 00:14 UTC · version 0.2.22
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save vox.ai and check future changes in Following.
Up to 3 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "vox.ai Single 에이전트의 Manual(업무 절차)을 한 번에 운영 수준으로 쓸 때 사용한다. 트리거, 단계·분기, 원문 문장, @tool 호출과 성공·실패 처리, Manual 나누기, 프롬프트·지식 분담을 다룬다. 기존 본문 수정·저장은 edit-manual-safely를 쓴다.",
"included_files": [],
"name": "manual-authoring",
"skill_md_contents": "---\nname: manual-authoring\ndescription: \"vox.ai Single 에이전트의 Manual(업무 절차)을 한 번에 운영 수준으로 쓸 때 사용한다. 트리거, 단계·분기, 원문 문장, @tool 호출과 성공·실패 처리, Manual 나누기, 프롬프트·지식 분담을 다룬다. 기존 본문 수정·저장은 edit-manual-safely를 쓴다.\"\nmetadata:\n product: vox.ai\n layer: general\n status: stable\n---\n\n# manual-authoring\n\n## 운영 수준 점검\nManual을 새로 설계할 때 지키고, 저장한 뒤 `get_agent`·`get_manual`로 다시 읽어 하나씩 확인한다. 좁은 기존 Manual 수정은 사용자가 요청한 범위를 유지한다.\n1. 질문 단계마다 다음 단계에 필요한 값이 없거나 불분명할 때의 행동을 적는다. 필요한 한 점만 확인하고, 답이 분명하면 덧붙인 확인 질문을 강제하지 않는다. 정보 제공 거절, 정정, 범위 밖 요청에도 할 행동을 적는다.\n2. 도구 호출마다 언제·입력·결과별 행동(성공/없음/실패·지연)을 쓰고, “실패하면 다시 부르지 않고 …(메모·콜백·안내)”처럼 대안을 적는다. 요청 접수·전송, 고객의 수신·이용 가능, 업무 완료를 구분하고 확인된 상태까지만 말한다. 전환·문자·등록처럼 부작용이 있는 도구는 고객 동의 뒤 호출한다.\n3. 순서가 중요한 곳은 게이트(\"…을 확인하기 전에는 …하지 않는다\")로, 반복은 상한(\"최대 2회. 넘으면 …\")으로 쓴다.\n4. 상담원 연결·연락처 확인처럼 두 Manual 이상이 쓰는 단계는 공용 Manual 하나에 두고 `@manual:<id>`로 넘긴다. 공통 마무리 질문과 인사는 프롬프트 `# 마무리` 한 곳에 둔다. Manual 완료 단계에는 결과별 종료 도구만 적고, 콜백 요청 접수와 실제 회신을 구분한다.\n5. 프롬프트에 둔 규칙(금지·말투·정해진 거절 문구)을 Manual에 다시 쓰지 않는다. 같은 대상(Manual·종료 도구)은 늘 같은 이름으로 부른다.\n6. 내용이 가까운 형제 Manual의 트리거에는 \"…은 제외한다(○○ 담당)\"를 붙인다. 고객이 실제로 할 법한 대표 발화를 인접한 트리거마다 대입해 겹침이나 공백이 있는지 확인하고, 모호한 경우 담당 Manual을 정한다. 평가용 발화는 검토 자료로만 두고 저장할 Manual 내용에 넣지 않으며, 대표 발화의 고정 개수는 정하지 않는다.\n7. 외부 변수는 `presetDynamicVariables`에 선언한다. 고객 발화·키패드 값을 도구·문자·기록·웹훅에서 쓸 때는 `extract_variables` 성공 뒤 사용한다. 고객에게 말할 값은 음성 발화 규칙을 따르고, 일회값은 API 도구 인자로 쓴다.\n8. 위급·안전 신호(통증·사고·누출 등)는 접수 Manual 끝에 묻어 두지 않고, 연결 도구를 가진 별도 진입 Manual로 둔다.\n9. 새 Single 또는 공통 prompt 전체 작성이면 `# 말투와 발화`에 음성 기본 규칙을 한 번 넣는다. 세부 내용은 [음성 프롬프트 기본 지침](../../references/voice-prompt-guidance.md)을 따르고, 각 Manual에 반복하지 않는다.\n\n어긋난 곳은 같은 `manual_id`(또는 `agent_id`)로 고친 뒤, 사용자에게 \"점검: ○○ 보완\" 한 줄로 알린다.\n\n## Manual이 통화에서 쓰이는 방식\n- 인사와 첫 용건 확인은 공통 prompt가 맡는다. 구체 업무가 식별되면 업무별 정보 수집이나 판단을 시작하기 전에 해당 Manual을 연다. 인사 직후부터 Manual 진입을 강제하지 않는다.\n- 에이전트는 Manual 목록(이름 + 트리거)을 본다. 대화가 **정확히 하나의** 트리거에 맞을 때, 또는 프롬프트가 그 Manual을 고르라고 할 때 연다. 둘 이상 맞거나 하나도 맞지 않으면 프롬프트 지시를 따른다. 트리거가 겹치면 아무것도 열리지 않을 수 있다.\n- 열린 Manual 본문이 `@manual:<manual_id>`로 넘기라고 하면, 대상 Manual은 트리거가 맞지 않아도 열린다.\n- Manual이 소유한 내장 도구는 그 Manual이 열려 있고 본문에 `@tool:이름`이 있을 때만 쓸 수 있다.\n- Manual 이름·ID·도구 이름은 내부 정보다. 고객에게 말하지 않는다.\n\n## 어디에 쓸까 (한 규칙은 한 곳에)\n| 위치 | 담는 것 |\n|---|---|\n| 프롬프트 | 정체성, 공통 규칙·금지, **Manual 선택 우선순위**, 공통 마무리 |\n| Manual | 의도 하나의 절차·분기·예외·도구·원문. 사실만 나열하는 Manual은 만들지 않는다. |\n| 지식 | 넓은 자료가 필요하거나 사용자가 요청한 경우만 검토([자료 정리](../knowledge-grounding/SKILL.md)). |\n| 동적 변수 | 통화별 값을 선언하고 빈 값 처리와 최신값 조회를 정한다. |\n\n프롬프트의 `# 말투와 발화` 줄에는 다음 공통 문구도 넣는다.\n`# 말투와 발화: 날짜를 되물을 때 시스템 날짜로 계산할 수 없으면 요일을 붙이지 않는다; 접수만 하고 확정은 나중에 하는 업무면 '아직 확정은 아니다'를 마무리에 한 번 말한다`\n\n- 프롬프트는 보통 1,500~4,000자다. 이보다 길어지면 업무 절차가 프롬프트에 들어간 것이니 Manual로 옮긴다.\n- Manual에 \"프롬프트의 ○○ 절을 따른다\"고 쓰지 않는다. 공통 규칙은 프롬프트가 늘 적용한다.\n- 프롬프트의 \"Manual 선택\" 절에는 우선순위를 쓴다. 예: ① 위급·안전 ② 진행 중인 Manual 계속 ③ 트리거가 하나만 맞으면 그 Manual ④ 둘 이상 맞으면 미리 정한 먼저 처리할 Manual ⑤ 아무것도 맞지 않으면 용건을 한 번 묻는다.\n\n## 몇 개로 나눌까\n- 고객 의도 하나에 Manual 하나다. 운영 에이전트는 보통 3~10개다.\n- 다음이면 나눈다.\n - 트리거가 \"또는\"으로 서로 다른 일을 묶는다.\n - 본문이 5,000자를 넘는다(한도 8,096자).\n - 같은 단계가 두 Manual 이상에 필요하다. 예: 상담원 연결, 본인 확인 → 공용 Manual.\n - 큰 분기 하나가 길다 → 하위 Manual. 이름은 `예약 > 비용 안내`처럼 쓴다.\n- 다음이면 합치거나 옮긴다.\n - 질문 순서와 도구가 같고 안내 문장만 다르다 → Manual 하나 안에서 분기한다.\n - 사실 안내뿐이다 → 절차가 없는 Manual은 없앤다. 적은 공통 사실은 프롬프트에, 업무별 사실은 해당 Manual에 두고, 많은 참고 자료가 필요할 때만 지식을 검토한다.\n- 방향(인바운드/아웃바운드)·페르소나·번호가 다르면 Manual을 늘리지 말고 에이전트를 나눈다.\n- 이름은 업무명으로 짓는다. \"새 메뉴얼\"처럼 비워 두지 않는다. 이름도 선택 목록에 들어간다.\n\n## 트리거 쓰기\n형식: `[진입 상황], [고객이 먼저 말하는 경우], 또는 [앞서 확인한 값을 정정할 때]. [제외: 형제 Manual 몫]`\n- 고객이 실제로 쓰는 낱말과 동의어를 나열한다. 음성 인식 오류에 대비해 \"말이 정확히 들리지 않아도 이런 낱말이 섞이면 이 Manual을 따른다\"를 붙일 수 있다.\n- 내용이 가까운 형제 Manual이 있으면 경계를 \"…은 제외한다(○○ 담당)\"로 적는다.\n- 대표 발화를 인접한 형제 트리거 각각에 대입해 겹침을 확인하고, 각 업무 상황의 담당 Manual을 정한다. 이 발화는 평가 자료에 두고 저장된 trigger/content에 그대로 옮기지 않는다. 필요한 만큼 비교하되 개수 자체를 맞추지 않는다.\n- 상태도 트리거가 될 수 있다. 예: \"상담원 전환이 실패했을 때\", \"본인 확인 뒤 통화 가능하다고 답했을 때\".\n- 1~3문장, 60~250자 정도로 쓴다.\n- 나쁜 예: \"예약\", \"인사말 하기 전\".\n- 좋은 예: \"이미 잡은 진료 예약의 날짜·시간을 바꾸거나 취소하려 할 때, 고객이 예약자 이름이나 날짜를 먼저 말할 때, 또는 앞서 말한 예약 정보를 정정할 때. 새 예약은 제외한다(진료 예약 담당).\"\n- 공용 Manual에도 트리거를 둔다(직접 요청 + 다른 절차에서 넘어온 경우). 연결로만 들어와야 할 때만 트리거를 비운다.\n\n## 본문 템플릿\n```\n## 규칙\n- 범위: 하는 일 / 하지 않는 일(→ @manual:<id>)\n- 완료 조건: 무엇이 확인돼야 완료라고 말하는가\n## 진행 절차\n### 시작\n1. 고객이 이미 말한 값은 확인만 하고 다음 단계로 간다.\n### <단계 이름>\n1. 필요한 안내 또는 질문 하나.\n - <조건>: <행동>\n - 다음 단계에 필요한 값이 없거나 불분명하면 필요한 점만 확인하고, 여전히 확인되지 않을 때는 <행동>.\n - 말하기를 거절하면 <행동>.\n### <도구 결과 처리>\n1. 언제: <조건>. 입력: <값의 출처>. @tool:<이름 또는 tool_id>를 부른다.\n - 성공: <행동> / 없음: <행동> / 실패·지연: 다시 부르지 않고 <대안>.\n### 완료\n1. 하위 Manual이면 원래 절차로 돌아간다. 전체 업무가 정상 완료되면 완료 조건을 확인해 결과를 알리고, 추가 도움 질문 → 답 대기 → 더 없으면 종료 도구 순서로 마친다. 새 요청이면 이어서 처리한다.\n```\n\n## 단계와 분기를 산문으로 쓰는 법\n조회·예약·결과 코드 분기도 이름 붙인 단계와 게이트로 쓴다. 순서나 여러 `@manual` 연결만으로 Flow로 바꾸지 않는다([유형 선택](../voice-agent-design/SKILL.md)).\n- 단계마다 이름을 붙이고, 이동은 \"'단계 이름'으로 이동한다\"로 쓴다. 이름과 번호가 상태 기계 역할을 한다.\n- 다음 단계가 고객의 행동 결과에 달려 있고 그 결과가 아직 분명하지 않을 때는 관찰 가능한 확인점(필요하면 화면 상태)을 정해 그곳까지만 안내한 뒤 답을 기다린다. 이미 결과를 분명히 들었거나 단순 안내·고정 고지문·낭독 Flow인 경우 확인 질문을 덧붙이지 않는다. 실제 화면 경로나 이름은 확인된 자료가 있을 때만 쓴다.\n- 한 턴에 질문 하나만 한다. \"네/아니요/없어요\"는 직전 질문과 현재 단계의 범위에서 해석한다. 추가 항목이 없다는 답을 전체 업무 종료로 보거나, 진행 동의를 이미 실행한 것으로 보지 않는다. 이미 들은 값은 묻지 않고 정정되면 그 값만 고친다.\n- 조건마다 번호를 붙여 행동을 적는다. \"그 밖에\"와 다음 단계에 필요한 값이 불명확할 때의 가지를 둔다. 답이 분명한 뒤에는 일반적인 확인 질문을 덧붙이지 않는다.\n- 반복에는 상한을 둔다: \"한 번만\", \"최초 포함 최대 2회\". 넘었을 때의 행동도 적는다.\n- 뒤에서 쓸 값은 \"…을 기억한다\"로 적는다. 의사가 바뀌면 가장 최근 의사를 따른다.\n- 순서를 지켜야 하면 게이트로 쓴다: \"본인 확인 전에는 계약 내용을 말하지 않는다\".\n- 고객의 중간 질문에는 먼저 답하고, 의도가 바뀌지 않았다면 확인된 값·완료한 점검·하위 Manual 결과를 유지해 원래 요청의 다음 미완료 단계로 돌아간다. 다른 Manual로 넘길 때도 이 절차를 멈추고 `@manual:<id>`를 시작한 뒤 돌아올 지점을 적는다. 새 의도로 바뀌면 이전 절차에 억지로 복귀하지 않는다.\n- \"적절히\", \"친절히\" 대신 조건과 행동을 쓴다.\n\n## 반드시·절대와 원문 문장\n- 고객에게 할 말을 지정할 때는 큰따옴표로 쓴다. 프롬프트에 \"큰따옴표 안 문장은 바꾸지 않고 그대로 말한다\"를 한 번 둔다.\n- 사용자가 준 문구는 다듬지 않고 그대로 옮긴다.\n- 채울 자리는 `[날짜]`처럼 대괄호로 쓰고 \"대괄호는 실제 값으로 바꿔 말한다\"를 적는다.\n- 금지 규칙에는 경계를 붙인다. 예: \"금액을 말하지 않는다. 비용 문의는 담당자 확인으로 안내한다.\"\n- 고지문 전체를 정해진 순서로 그대로 읽는 것이 업무의 중심이면 Flow를 검토한다([voice-agent-design](../voice-agent-design/SKILL.md) F2). 문장 몇 개만 고정이면 Manual로 충분하다.\n\n## 도구 쓰기 (@tool)\n- 내장 도구(`end_call`, `transfer_call`, `transfer_agent`, `send_sms`, `send_dtmf` 등)\n - 그 Manual의 `built_in_tools`에 넣고 본문에서 `@tool:이름`으로 부른다. 이름은 그 Manual의 `built_in_tools`에 있는 이름과 정확히 같아야 한다. 에이전트나 다른 Manual의 도구를 가리키면 저장 진단 `BUILT_IN_TOOL_NOT_DEFINED`가 나고, 통화에서는 \"(현재 이용할 수 없는 기능)\"으로 바뀐다.\n - 이름은 에이전트 안에서 고유한 영문 소문자 snake_case로 쓴다(`[a-z_][a-z0-9_]*`). 런타임은 대문자를 소문자로 바꾸고 그 밖의 문자는 지운다.\n - 도구 `description`에는 호출 조건을 한 줄로 쓴다. 통화 중 모델은 이 문장을 보고 도구를 고른다.\n - 도구별 업무 신호와 결과 처리는 아래 [내장 도구별 신호와 결과](#내장-도구별-신호와-결과)를 따른다.\n- API 도구: `@tool:<tool_id>`로 부른다. `list_tools`/`save_tool`이 돌려준 UUID를 쓴다. 없는 도구를 지어내지 않는다. 도구가 없으면 그 공백을 사용자에게 말한다.\n- 도구 호출마다 네 가지를 적는다.\n 1. **언제**: 조건, 그리고 필요하면 고객 동의.\n 2. **입력**: 각 값을 어디서 가져오나(고객 발화, 앞 결과, 변수).\n 3. **결과별 행동**: 성공, 값마다, 없음, 실패, 지연을 각각 처리한다.\n 4. **다시 부르지 않을 조건**: 중복 호출과 재접수를 막는다.\n- \"완료\"·\"접수됐다\"·\"보냈다\"는 해당 상태를 실제로 확인한 뒤에만 말한다. 요청 수락·전송은 고객 수신·이용 가능이나 업무 완료를 뜻하지 않는다. 지연이나 오류 뒤에는 같은 쓰기 도구를 자동으로 다시 부르지 않는다.\n- 문자: 고정 링크면 static으로 설정하고 아래 내장 도구별 계약을 따른다.\n- 전환\n - 연결 질문에 고객이 긍정한 뒤에 호출한다.\n - 대기 멘트는 도구가 말하므로 같은 말을 반복하지 않는다.\n - 실패하거나 상대가 받지 않으면 메모·콜백 같은 대안으로 넘어간다. 같은 통화에서 두 번 실패하면 더 시도하지 않는다.\n- 종료\n - 결과를 나눠 보고 싶으면 결과마다 `end_call`을 하나씩 둔다(`finish_booked`, `finish_callback` 등, description에 결과를 쓴다).\n - \"상태 → 종료 도구\" 대응을 Manual 안에 적는다.\n - 종료 도구에 작별 인사가 설정돼 있으면 따로 인사하지 않는다.\n### 주소 수집 패턴\n- 방문·배송·출동처럼 주소를 업무에 쓰면 해당 Manual의 `built_in_tools`에 내장 `search_address`를 붙이고 본문에서 `@tool:search_address`로 부른다(설정 형식은 현재 저장 schema 확인).\n- 단계: 고객이 말한 도로명·건물번호, 지번 또는 건물·장소명 단서 받기 → `@tool:search_address` → 후보를 읽어 주고 고객 확인받기 → 확인된 주소와 상세 동·호를 업무의 저장 도구에 전달한다.\n- 도구는 주소를 확정하거나 저장하지 않는다. 고객 확인이 확정이며, 저장 성공 응답 전에는 접수 완료라고 말하지 않는다.\n- 후보가 여럿이면 지역·도로명·건물번호 등 구분 단서를 한 번 더 받고 조회한 뒤 선택 후보를 확인받는다. 그래도 모호하면 원문과 '확인 필요'를 남긴다.\n- 후보에 `dongs`가 있으면 동을 확인받고 호수는 따로 받는다.\n- `recommended_action=single_confirm_top_candidate`이면 최상위 후보를 읽고 확인받으며, `ask_disambiguation`이면 후보 차이를 설명하고 구분 단서를 한 번 받는다.\n- `ask_for_core_address`는 건물·장소명만 말했을 때 후보가 있어도 나온다. 후보를 바로 확정하지 않고 시·군·구와 도로명 또는 지번을 한 번 더 받는다.\n- `no_hit_retry`와 `missing_clue=core_address`(0건)이면 다시 말해 달라고 한 번 요청하고 조회한다. 그래도 없으면 원문으로 접수하고 '확인 필요'를 남긴다.\n- `no_hit_retry`와 `missing_clue=source_unavailable`(검색 장애)이면 고객에게 다시 말하게 하지 않는다. 자동 재호출 없이 원문으로 접수하고 '확인 필요'를 남긴다.\n- 도구 오류·지연도 자동 재호출 없이 원문과 '확인 필요'를 남긴다. 실제 응답에 없는 값은 추측하지 않는다.\n\n- Manual 본문이 `@tool:`로 부르는 내장 도구(종료 도구 포함)는 그 Manual의 `built_in_tools`에 정의한다. 에이전트 공통 `data.built_in_tools`의 도구는 본문에서 부를 수 없다.\n- 내부 ID·코드·필드명은 읽지 않는다. 고객이 받아 적어야 하는 번호만 한 자리씩 읽는다.\n\n### 내장 도구별 신호와 결과\n텍스트 채팅 시험에서는 `extract_variables`와 종료 도구가 실행된다. 주소 검색·전환·문자·DTMF는 음성 통화 시험으로 확인한다. 아래 결과는 음성 통화 기준이다. 오류 문구와 내부 사유는 고객에게 읽지 않는다.\n- `extract_variables`: 고객이 말하거나 키패드로 누른 값을 뒤에서 `{{name}}`으로 다시 써야 할 때 해당 단계의 `built_in_tools`에 변수를 정의하고 본문에서 `@tool:extract_variables`로 부른다. 성공 결과를 받은 뒤에만 그 값을 사용한다. 값을 추출하지 못하면 이전 값이 유지될 수 있으므로 비어 있다고 가정하지 않는다.\n- `transfer_call`: \"상담원·직원·담당자 바꿔 주세요\"처럼 사람 응대가 필요할 때 쓴다.\n - 연결 대상이 여럿이면 대상마다 `transferCondition`을 쓴다. 모델은 이 조건을 보고 대상을 고른다.\n - 성공하면 `transfer_successful: true`가 온다. cold 전환이면 AI는 통화에서 빠진다.\n - 전환이 안 되면(warm에서 상대가 `ringDurationInSeconds`초 안에 받지 않음(1~90, 비우면 30), 웹 통화 등) `transfer_call failed: <사유>` 오류가 오고 AI가 통화를 이어 간다. 위 '전환'의 대안으로 넘어간다.\n - 웹 통화에서는 대기 멘트를 말한 뒤에 실패한다. 전환은 전화로 시험한다.\n- `transfer_agent`: 다른 업무나 언어를 맡은 같은 조직의 에이전트가 이어받아야 할 때 쓴다. 대상은 `agent.agent_id`로 정하고, 없는 에이전트를 지정하면 저장이 거부된다.\n - 성공하면 대상 에이전트가 대화를 이어받는다. `preserveChatContext`가 false면 대상은 앞 대화를 모르므로, 넘기기 전에 받은 값을 다시 묻게 된다.\n - 실패하면 \"Transfer failed…\" 오류가 오고 지금 에이전트가 계속 응대한다. 다시 부르지 않고 현재 Manual의 대안으로 간다.\n- `send_sms`: \"문자로 보내 드릴게요\"처럼 링크·서류 목록·계좌처럼 받아 적기 어려운 내용을 전할 때 쓴다.\n - 받는 번호는 지금 통화의 상대 번호로 정해져 있다(인바운드는 건 사람, 아웃바운드는 받은 사람). 다른 번호로 보내겠다고 약속하지 않는다.\n - 웹 통화에서는 보낼 수 없다. dynamic 문자는 모델이 80자 안으로 쓴다. static 본문에서 값이 없는 `{{변수}}`는 빈칸으로 나간다.\n - 전송 전에 필요한 동의를 확인한다. `success: true`는 발송 성공만 뜻하며 수신·이용 가능이나 업무 완료를 입증하지 않는다. 오류·미수신·이용 불가 때 자동 재발송하지 않고 실제 지원되는 대체 경로를 따른다([연동 설계](../tool-integration-design/SKILL.md#완료를-정의한다)). `responseMode=fire_and_forget`이면 결과를 기다리지 않으므로 \"보내 드리겠습니다\"처럼 예정으로만 말한다.\n- `send_dtmf`: 아웃바운드 통화에서 상대 ARS가 \"○번을 눌러 주세요\"라고 할 때 에이전트가 번호를 누르는 도구다. 고객이 우리 쪽 키패드 메뉴를 누르는 업무에는 쓰지 않는다([유형 선택](../voice-agent-design/SKILL.md)의 Flow).\n - 입력은 `digits`(0-9, `*`, `#`)다. 성공하면 결과 문장 없이 다음 안내를 기다린다. 실행 중 멘트는 지원하지 않고, 이어서 누를 때는 3초 간격이 생긴다.\n - 실패하면 `success: false`와 `error`가 온다. 같은 메뉴에서는 한 번만 다시 누르고, 그래도 안 되면 음성 응답이나 사람 연결로 넘어간다.\n- `end_call`: 끝인사를 마쳤거나 고객이 더 문의할 것이 없다고 할 때, 결과별 종료가 정해졌을 때 쓴다.\n - 실행 중 멘트가 있으면 그것을 작별 인사로 말한 뒤 끊고, `call_ended: true`가 온다.\n - Single 에이전트에서 고객이 작별 인사를 끊고 말하면 `call_ended: false, interrupted: true`가 오고 통화가 이어진다. 고객 말에 답한 뒤 다시 종료한다.\n\n## 저장 순서와 확인\n1. `save_agent(mode=create)`로 Single을 만든다(`type`은 생략하거나 `single_prompt`). 모델 선택과 구 API 예외는 [에이전트 구축의 모델 선택 규칙](../build-first-voice-agent/SKILL.md#모델-고르기)을 따른다. 템플릿으로 시작하면 생성 직후 현재 revision을 읽고 선택한 모델을 적용한다. 프롬프트에는 공통 규칙과 Manual 선택 절을 넣는다. 템플릿으로 시작했다면 기본 프롬프트의 업종·방향·완료 문구가 새 Manual과 충돌하지 않게 고쳐 쓴다.\n2. 다른 Manual이 `@manual:`로 가리킬 대상(공용 상담원 연결, 하위 Manual)을 **먼저** `save_manual(mode=create)`로 저장해 `manual_id`를 받는다. 그다음 참조하는 Manual을 저장한다. 서로 가리키는 경우에는 먼저 저장한 뒤 `mode=update`로 전체 본문을 다시 보낸다.\n3. `save_manual` 호출이 곧 에이전트에 연결하는 일이다. `data.manuals` 맵이나 폐기된 `manualIds`를 손으로 만들지 않는다. 저장할 때마다 revision이 바뀌므로 매번 직전에 읽은 `expected_head_revision`을 쓴다.\n4. 저장한 뒤 확인한다.\n - `list_manuals`: `total_count`, 트리거 있는 Manual(`is_entry`) 수, 모든 `diagnostic_count == 0`.\n - `get_manual`: 참조 도구·Manual이 의도와 같은지 본다.\n - 신규 설계에서는 의도한 진입 트리거부터 모든 조건 분기와 `@manual` 연결을 따라가며 대상 Manual의 도구 소유·참조, 원래 절차로의 복귀 또는 의도한 종료·전환을 확인한다. 의도한 진입점이나 연결에서 도달하지 않는 Manual과 빠져나오지 못하는 경로도 찾는다. 조건과 종료 경로가 분명한 순환은 그 자체로 오류가 아니며, 연결 깊이만으로 Flow를 선택하지 않는다. 서버 진단과 재조회는 필요하지만 전체 경로 검토를 대신하지 않는다.\n5. 실제 통화 시험 전에는 \"저장·확인 완료, 시험 전\"으로 보고한다.\n\n## 피할 것\n- 완료·예외 없는 한두 줄 Manual, 결과 확인 전 완료 안내, 실패 뒤 쓰기 도구 재호출.\n\n## 예시와 연결\n- [Manual 예시](../../references/manual-examples.md).\n- 기존 Manual 수정 [edit-manual-safely](../edit-manual-safely/SKILL.md), 자료 [knowledge-grounding](../knowledge-grounding/SKILL.md), API 도구 [connect-agent-tools](../connect-agent-tools/SKILL.md).\n"
}SHA-256 of public snapshot: 7c68f7b6d7606c0ce48399bb6ca13990b79d00dc837363ac2512bba5143e9706