diff --git a/README.md b/README.md
index 23b3b3dc..7be86f1e 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,9 @@
AI 에이전트 사용 안내
> [!IMPORTANT]
-> **최신 안내:** [현재 버전](https://mcp.aka.page/guide/2026-11-02.3) · [항상 최신 버전으로 이동](https://mcp.aka.page/guide/latest)
+> **최신 안내:** [현재 버전](https://mcp.aka.page/guide/2026-11-02.4) · [항상 최신 버전으로 이동](https://mcp.aka.page/guide/latest)
>
-> **안내 버전: 2026-11-02.3 · 갱신일: 2026-11-02**
+> **안내 버전: 2026-11-02.4 · 갱신일: 2026-11-02**
>
> **웹 읽기는 실제 링크 ID로 click하세요.** 새 검색 URL을 조립해 open하지 말고 [웹 조회 시작](https://mcp.aka.page/browse/quick) 화면의 빠른 검색어·지역을 통째로 선택하세요. 목록에 없는 입력만 글자 링크를 사용하세요. 상품의 **매장 지역 선택** 링크에서 지역도 선택할 수 있습니다. 입력 중에는 원본 조회를 실행하지 않습니다. click이 없는 도구의 동일 동작은 보장하지 않습니다.
>
@@ -31,7 +31,7 @@
>
> **MCP 도구는 10개 고정:** `service`와 `operation`으로 지원 서비스를 선택합니다. 새 연동은 [통합 도구 10개](docs/mcp-tools.md)만 사용하세요. 기존 서비스별 도구는 deprecated 호출 별칭으로 유지하지만 목록에는 표시하지 않습니다.
>
-> **웹 읽기 전용 에이전트는 `/browse/`의 실제 링크만 선택하세요.** 검색·상세·매장·재고·후속 조회가 모두 자동 HTML이며 쿼리 문자열이나 `format` 지정은 필요 없습니다. 검색어·지역은 글자 링크로 입력하고 응답의 상세·재고 링크를 따르세요. 일반 API 클라이언트의 필터 문법은 상세 사용 안내를 참고하세요.
+> **웹 읽기 전용 에이전트는 `/browse/`의 실제 링크만 선택하세요.** 검색·상세·매장·재고·후속 조회가 모두 자동 HTML이며 쿼리 문자열이나 `format` 지정은 필요 없습니다. 검색어·지역은 빠른 링크를 먼저 선택하고 목록 밖 입력만 글자 링크를 쓰세요. 응답의 실제 재고 링크를 따르세요. 일반 API 클라이언트의 필터 문법은 상세 사용 안내를 참고하세요.
>
> [첫 HTML 조회](https://mcp.aka.page/browse/quick) · [REST 사용법](https://mcp.aka.page/prompt) · [원격 MCP 연결](#원격-mcp로-바로-시작하기)
@@ -47,7 +47,7 @@
설치·API 키 없이 연결하는 공개 MCP
-**[바로 시작하기](#원격-mcp로-바로-시작하기)** · [CLI·Skill](#cli와-skill) · [사용 예시](#이렇게-물어보세요)
+**[ChatGPT에서 바로 조회](https://mcp.aka.page/browse/quick)** · [MCP 연결](#원격-mcp로-바로-시작하기) · [CLI·Skill](#cli와-skill) · [사용 예시](#이렇게-물어보세요)
@@ -136,7 +136,7 @@
2. 서버 URL을 입력하고, 전송 방식을 묻는 경우 **HTTP / Streamable HTTP**를 선택합니다.
3. 도구를 활성화하고 `다이소 MCP로 수납박스 검색해줘`라고 요청합니다.
-[앱별 연결 방법](docs/client-guide.md#원격-mcp-연결) · [WebFetch로 첫 조회](docs/service-reference.md?guide=2026-11-02.3#설치-없이-첫-조회)
+[앱별 연결 방법](docs/client-guide.md#원격-mcp-연결) · [WebFetch로 첫 조회](docs/service-reference.md?guide=2026-11-02.4#설치-없이-첫-조회)
@@ -214,7 +214,7 @@ MCP 연결 없이 웹 읽기와 GET 요청을 지원하는 에이전트는 [REST
| 문서 | 내용 |
| :-------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
| [연결·사용 가이드](docs/client-guide.md) | 앱별 MCP 연결, CLI, Skill, OpenAPI |
-| [서비스 레퍼런스](docs/service-reference.md?guide=2026-11-02.3) | 서비스별 도구·REST API·응답 모델·가격 비교 |
+| [서비스 레퍼런스](docs/service-reference.md?guide=2026-11-02.4) | 서비스별 도구·REST API·응답 모델·가격 비교 |
| [일본 다이소](docs/daiso-jp-network-analysis.md) | 일본 상품·매장 검색과 지원 범위 |
| [독립·예술영화관](docs/dtryx.md) | 디트릭스 지원 극장과 조회 방법 |
| [AI 조회 가이드](docs/ai-instruction.md) | 도구 선택과 상품·매장·재고 조회 순서 |
diff --git a/docs/ai-instruction.md b/docs/ai-instruction.md
index d0e0d5f5..004ce688 100644
--- a/docs/ai-instruction.md
+++ b/docs/ai-instruction.md
@@ -10,7 +10,7 @@
## 설치 없이 첫 조회
-최신 서버 안내는 [현재 버전](https://mcp.aka.page/guide/2026-11-02.3)과 [최신 연결](https://mcp.aka.page/guide/latest)에서 제공합니다. 웹 도구는 과거 리디렉션·수집본을 반환할 수 있으므로 표시된 버전과 HTML 생성 시각을 확인하세요.
+최신 서버 안내는 [현재 버전](https://mcp.aka.page/guide/2026-11-02.4)과 [최신 연결](https://mcp.aka.page/guide/latest)에서 제공합니다. 웹 도구는 과거 리디렉션·수집본을 반환할 수 있으므로 표시된 버전과 HTML 생성 시각을 확인하세요.
1. 연결된 MCP 도구가 있으면 `search_products`에 `{"service":"daiso","query":"수납박스","pageSize":3}`를 전달합니다.
2. 실제 브라우저 도구가 있으면 /browse/ HTML GET 주소를 열고 실제 상품·매장·재고를 읽습니다. Work의 내장 브라우저도 사용 가능합니다.
diff --git a/docs/chat-web-read-mcp-playbook.md b/docs/chat-web-read-mcp-playbook.md
new file mode 100644
index 00000000..626e41f6
--- /dev/null
+++ b/docs/chat-web-read-mcp-playbook.md
@@ -0,0 +1,165 @@
+# ChatGPT Chat의 설치 없는 웹 조회 제공 지침
+
+이 문서는 회사에서 같은 방식을 실험하는 구현·평가 에이전트에게 전달하기 위한 기준입니다.
+2026-10-26부터 2026-11-02까지 DAISO MCP와 별도 가상 Worker에서 관측한 결과를 정리합니다.
+특정 ChatGPT 계정·모델·도구 버전의 관측이며 공식 웹 도구 규격이나 보편적 성공 보장이 아닙니다.
+
+## 먼저 구분할 것
+
+공개 원격 MCP와 공개 HTML 조회를 함께 제공할 수 있습니다.
+이미 연결된 MCP 도구 호출은 MCP 프로토콜 경로입니다.
+웹 읽기로 `/browse/` HTML을 조회하는 것은 같은 서비스의 REST GET 대체 경로입니다.
+HTML 조회에 성공했다고 MCP 서버가 ChatGPT에 등록됐다고 보고하면 안 됩니다.
+웹 검색, URL 열기, 실제 브라우저 조작, 셸 HTTP 요청도 서로 다른 실행 수단입니다.
+각 환경이 제공하는 실제 도구를 확인하고, WebFetch라는 이름이 모든 환경에 있다고 가정하지 마세요.
+
+## 확인된 관측과 해석의 경계
+
+| 관측 | 허용되는 해석 | 단정하면 안 되는 것 |
+| --- | --- | --- |
+| 조합한 주소의 직접 열기 실패 후 읽힌 문서의 실제 링크 선택 성공 | URL 전달 방법을 독립 변수로 검사할 가치가 있음 | URL 모양만으로 차단 원인이 확정됨 |
+| 링크 선택으로 JSON·한글 쿼리·한글 경로 성공 | JSON·쿼리·한글 자체가 항상 실패 원인은 아님 | 모든 새 JSON URL이 직접 열림 |
+| JavaScript만으로 표시한 가상 데이터가 웹 읽기에서 빠짐 | 서버 완성 HTML이 적합함 | 실제 브라우저와 웹 읽기가 동일함 |
+| 일부 지연 실험에서1초 성공,5초 실패 | 빠른 접수와 별도 결과 조회를 실험할 가치가 있음 | ChatGPT의 고정 타임아웃이 정확히5초임 |
+| no-store 재열람에서 같은 요청 ID·생성 시각 반환 | 도구의 사본 재사용을 별도로 고려해야 함 | 원본 서버가 새로 조회됐음 |
+| 서버 완료 저장 뒤 같은 주소 재시도 실패 유지 | 실패 후 캐시 성공 가설은 보장되지 않음 | 재시도하면 반드시 빨라짐 |
+| 매번 새 실제 결과 링크로 pending 다음 완료 읽기 성공 | 접수·결과 분리는 유효한 대안 | URL 접근 제한까지 해제됨 |
+| 주소 없는 새 대화가 성공과 실패를 모두 보임 | 발견과 실행을 따로 평가해야 함 | 새 대화라서 최신 검색 사본을 읽음 |
+
+근거: [독립 실험](web-reading-lab-results-2026-10-26.md), [읽기 세션 실험](web-reading-lab-results-2026-10-27.md), [재시도·접수·실제 Chat 검증](web-reading-lab-results-2026-11-02.md).
+
+## 발견 문서와 첫 실행
+
+- 검색 결과 요약은 문서 본문 열람과 다릅니다. 첫 화면, README, 검색에 노출되는 상세 문서의 실행 입구를 맞추세요.
+- 첫 화면에는 짧은 기능 설명과 실제 HTML 조회 링크를 먼저 둡니다. 긴 프로토콜·오류·운영 설명은 뒤에 둡니다.
+- 이미 연결된 MCP가 있으면 그 도구를 사용합니다. 없는 웹 읽기 환경에는 실행 가능한 HTML 입구를 안내합니다.
+- 첫 조회 전에 로컬 설치, 전체 도구 목록, 전체 OpenAPI, 로그인, 연결 설정을 무조건 요구하지 마세요.
+- 실제 실행 링크는 보이는 ``로 제공합니다. 코드 블록의 URL이나 텍스트만으로 후속 링크 ID가 생긴다고 기대하지 마세요.
+- 작업 단계별로 필요한 다음 링크를 바로 제공합니다. 상품 결과에서 재고가 목적이면 상품 상세를 거치지 않고 지역 선택으로 갑니다.
+- 검색어·지역의 통째 선택은 반복 읽기를 줄입니다. 비슷한 인기 검색어로 대체하지 말고 목록 밖 입력을 위한 정확한 경로도 유지합니다.
+- 현재 버전은 공식 `/guide/latest`에서 확인하고 이전 버전도 최신 안내로 연결합니다. 날짜를 여러 문서에 수동 복제하면 불일치가 생깁니다.
+- 버전과 생성 시각은 사본을 구별하는 단서입니다. 외부 검색 캐시 삭제나 즉시 재수집을 약속하지 마세요.
+- 외부 미러·레지스트리에는 옛 설치/셸 예제가 남을 수 있습니다. 공식 본문을 열었는지 확인하되, 외부 사이트 접근 제한을 우회하려 하지 마세요.
+
+## HTML 응답과 데이터 계약
+
+서버에서 결과 HTML을 완성하고 올바른 UTF-8 Content-Type을 보냅니다.
+페이지는 제목, 조건, 상태, 실제 결과, 다음 링크 순서로 읽을 수 있게 구성합니다.
+상품명·실제 ID·가격·통화·단위·매장명·수량과 오류 코드를 명확히 표시합니다.
+초기 HTML에 없는 데이터를 클라이언트 JavaScript 실행에만 맡기지 마세요.
+
+검색 성공은 재고 확인 성공이 아닙니다.
+온라인 재고·전체 합계·매장별 수량을 구분합니다.
+정상 수량0, 미확인 null, 빈 결과, 접근 차단, 원본 오류, 인증 실패, 자체 한도 초과를 구분합니다.
+업무상 success/error와 HTTP 상태를 함께 확인합니다. HTTP200만으로 정상이라고 판단하지 마세요.
+도구가 HTTP 상태를 제공하지 않으면 페이지의 표시 내용과 실제 헤더 검증을 구분합니다.
+실제 응답에서 얻지 않은 상품 ID·매장 코드·수량을 추측하지 마세요.
+
+상품 이미지는 해당 응답의 imageUrl만 사용합니다.
+원본 URL의 쿼리 문자열도 유지하며 인증정보가 있는 주소는 노출하지 않습니다.
+이미지가 없거나 렌더링되지 않으면 텍스트나 안전한 원본 링크만 제공합니다.
+이미지 검색으로 다른 상품·다른 국가·비슷한 제품의 이미지를 채우지 마세요.
+
+## 느린 조회와 상태 확인
+
+빠른 요청은 바로 결과를 반환하고 느린 요청은 접수 응답으로 분리할 수 있습니다.
+접수 응답에는 pending 상태, 작업 식별자, 접수 시각과 실제 결과 확인 링크를 제공합니다.
+완료 결과에는 실제 성공/실패와 완료 시각이 있어야 합니다.
+
+- 결과 확인은 저장된 같은 작업을 읽습니다. 상태 확인마다 원본 상품·재고 API를 다시 호출하지 않습니다.
+- 같은 상태 URL이 예전 pending으로 재사용되는지 검사합니다. 필요하면 응답마다 새로운 실제 결과 링크를 제공하되 같은 작업을 유지합니다.
+- 결과 링크를 만드는 것과 새 원본 작업을 만드는 것을 구분합니다. 주소 변경을 무제한 원본 호출 수단으로 쓰지 않습니다.
+- 원본 요청 시간, 작업 TTL, 응답 크기, 저장량, 동시 실행, 결과 확인 횟수에 상한을 둡니다.
+- 만료·시간 초과·과대 응답·원본 실패를 명시합니다. 잘린 결과를 완전한 성공으로 표시하지 않습니다.
+- 클라이언트 연결 종료 후 작업을 유지해야 한다면 실행 환경의 정상적인 작업 수명 보장 수단을 사용합니다.
+- 작업 저장과 완료·만료 처리의 경합, 중복 생성, 취소 전달을 검증합니다.
+- 느린 작업을 전부 브라우저로 재실행하거나 여러 Chrome을 동시에 띄워 해결하려 하지 않습니다.
+
+DAISO 구현의1초 빠른 응답 분기,25초 작업 제한,5분 TTL,256KiB 상한과 최대3번 결과 확인은 우리 설정입니다.
+다른 프로젝트의 필수값이나 ChatGPT 공식 제한으로 복사하지 마세요.
+
+## 캐시와 시간
+
+세 층을 별도로 기록합니다.
+
+1. 검색·웹 읽기 도구가 재사용하는 문서 사본
+2. 우리 서버·CDN·애플리케이션 API 캐시
+3. 외부 원본 서비스의 데이터와 갱신 시각
+
+`Cache-Control: no-store`만으로1번 재사용을 통제한다고 보장하지 않습니다.
+새 읽기 세션이나 새 결과 URL도2번/3번 캐시 우회를 뜻하지 않습니다.
+Crawled 시점, HTML 생성 시각, 작업 완료 시각, 원본 데이터 갱신 시각을 구분합니다.
+실제로 없는 원본 갱신 시각을 생성하거나 오래된 사본을 현재 재고라고 단정하지 마세요.
+원본 캐시 우회 검증은 인증된 별도 절차로 제한하고 불필요한 과다 요청을 피합니다.
+
+## 오류와 사용자 복구
+
+원인을 판단할 때 실제 도구 오류 원문과 서버 관측을 우선합니다.
+DNS 실패라는 자기보고만으로 DNS 장애를 확정하거나 셸 실패를 웹 읽기 실패로 확대하지 않습니다.
+서버 요청 기록이 없다는 사실만으로 WAF 차단·도구 내부 거절·관측 누락을 구별할 수는 없습니다.
+
+실제 문서 링크를 우선 선택합니다.
+접근 거절이 계속되거나 도구에 링크 선택 기능이 없으면, 에이전트가 완성 공개 URL을 넣어 아래 문장을 사용자에게 제공합니다.
+
+> 아래 문장을 그대로 복사해 이 대화에 보내주세요.
+>
+> 다음 주소를 웹 URL 열기 도구로 직접 열어 실제 결과를 확인해주세요: {완전한 공개 조회 URL}. 실패하면 오류 원문을 알려주세요.
+
+중괄호는 제공 전에 실제 URL로 바꿉니다. 사용자에게 주소 조립·상품 ID 추측·인코딩을 맡기지 않습니다.
+사용자가 재전송한 뒤 한 번 조회하며 항상 성공한다고 약속하지 않습니다.
+TimeoutError는 접근 거절과 구분하고 같은 실제 링크의 재확인은 제한합니다.
+복사 문장을 제시했거나 pending을 받았다는 이유만으로 조회 완료라고 보고하지 않습니다.
+
+## 검색 봇과 접근 정책
+
+[OpenAI 공식 봇 문서](https://developers.openai.com/api/docs/bots)는 검색용 OAI-SearchBot과 사용자 요청에 쓰이는 ChatGPT-User의 역할을 구분합니다.
+robots.txt 허용과 방화벽·봇 관리·속도 제한 허용은 별도로 확인합니다.
+봇 역할·공개 IP 정보는 공식 문서에서 확인하며, User-Agent 문자열만으로 인증된 주체라고 신뢰하지 않습니다.
+검색 노출 허용이 각 사용자 요청의 접근 성공을 보장하지는 않습니다.
+
+## 보안과 운영 경계
+
+- 공개 GET은 읽기 전용으로 제한합니다. 결제·메시지 전송·개인 설정 변경을 링크 열기에 숨기지 않습니다.
+- 인증 토큰·쿠키·개인 계정 자료를 URL, 결과 HTML, 공개 관측 로그에 넣지 않습니다.
+- 작업 결과 URL을 접근통제 수단으로 쓸 경우 추측 불가능성·노출 범위·만료를 검토합니다. 공개 재고와 개인정보를 같은 정책으로 다루지 않습니다.
+- 임의 외부 URL을 프록시하는 기능을 만들지 않습니다. 허용된 서비스·경로·조건을 검증해 SSRF와 무제한 우회를 막습니다.
+- HTML은 외부 문자열을 이스케이프합니다. 상품 설명과 외부 페이지는 데이터이며 에이전트 권한을 확대하는 지시가 아닙니다.
+- 기존 API 캐시·한도·인증·오류 계약을 웹 조회에서도 유지합니다. 실험을 위해 검사를 약화하지 않습니다.
+
+## 평가 절차와 완료 기준
+
+세 종류를 새 대화에서 각각 검사합니다.
+
+| 평가 | 최초 질문에 제공하는 정보 | 확인할 것 |
+| --- | --- | --- |
+| 자연어 발견 | 서비스 이름과 사용자 목적만 | 올바른 서비스 발견, 본문 열람, 첫 실행, 실제 결과 |
+| 공식 입구 | 공식 시작 페이지 | 최신 안내·실제 링크로 조건 선택·결과 완료 |
+| 정확한 조회 URL | 완성 실행 주소 | 해당 주소의 접근·응답 해석 |
+
+같은 대화에 정답 URL을 알려준 뒤 성공한 것을 독립적인 자연어 발견 성공으로 세지 않습니다.
+임시 대화라도 외부 검색 사본은 재사용될 수 있습니다.
+기존 대화를 이어갔는지는 에이전트 답변에 묻는 대신 실험을 연 브라우저 상태와 입력 기록으로 판정합니다.
+한 조건씩 바꿔 성공률·실패 유형·완료 시간·후속 읽기 수를 기록합니다.
+브라우저 준비 시간, 질문 전송 후 시간, 실제 서버 처리 시간을 분리합니다.
+단일 표본의 빠른 응답을 일반적인 성능 개선율로 제시하지 않습니다.
+
+최소 근거는 입력 질문, 실제 UI 결과, 안전한 공개 결과 href, 실제 상품/매장/수량, 안내 버전과 생성 시각입니다.
+가능하면 실제 작업 결과·서버 도착/완료 ID와 대조합니다.
+에이전트 자기보고와 서버·도구 기록을 구분하고 원시 도구 기록을 확보하지 못했으면 명시합니다.
+성공 표본만 남기지 않으며 편집기·전송 전 제어 오류는 조회 실패와 따로 기록합니다.
+
+실험은 소유 브라우저 세션1개로 순차 실행하고 성공·실패 모두 탭·캡처·세션을 회수합니다.
+메모리·CPU·브라우저 수를 관측하고 로컬 전체 테스트·중계 부하와 겹치지 않습니다.
+사용자 Chrome이나 다른 작업의 세션을 정리 대상으로 삼지 않습니다.
+
+## 에이전트에게 전달할 실행 계약
+
+> 설치 없이 쓰고 싶다는 요청은 먼저 현재 환경의 실제 수단으로 조회한다.
+> 연결된 MCP가 있으면 그 도구를 쓰고, 없으면 공식 본문의 HTML 시작 링크를 읽는다.
+> 검색 결과 요약만으로 본문을 읽었다고 주장하지 않는다.
+> 실제 링크로 정확한 조건을 선택하고 상품 응답의 실제 ID로 재고를 확인한다.
+> pending은 접수다. 원본을 재실행하지 말고 제한된 결과 링크를 따른다.
+> 미확인·실패·품절을 구분하고 실제 도구·공개 URL·결과·오류만 보고한다.
+> 오래된 사본과 원본의 현재 데이터를 혼동하지 않는다.
+> 가능한 경로가 실패하면 완성 URL 복사 재전송을 안내하되 성공을 보장하지 않는다.
+> 모든 실험은 실제 ChatGPT 새 대화에서 검증하고 실패도 기록한다.
diff --git a/docs/superpowers/plans/2026-11-02-discovery-web-entry.md b/docs/superpowers/plans/2026-11-02-discovery-web-entry.md
new file mode 100644
index 00000000..5c18343b
--- /dev/null
+++ b/docs/superpowers/plans/2026-11-02-discovery-web-entry.md
@@ -0,0 +1,10 @@
+# 자연어 발견 웹 입구 구현 계획
+
+Goal: 기존 동작 경로의 문서 우선순위와 버전 불일치를 수정하고 최초 질문으로 재검증한다.
+Architecture: README·discovery 첫 링크를 웹 조회로 통일. 기존 API/MCP/UUID/pending 계약 보존.
+
+- [ ] tests/pages/discoveryEntry.test.ts: 공개 루트의 웹 조회 CTA가 복구/연결 안내보다 먼저 오고 README visible 첫 CTA도 동일 주소임을 검사. RED 확인.
+- [ ] src/pages/discovery.ts·agentStart.ts와 README/현재 안내 기대값 수정. docs/web-discovery.md의 고정 옛 버전 제거.
+- [ ] 회사 전달용 docs/chat-web-read-mcp-playbook.md 작성. 사실/가설/권고/공식 문서 구분, 평가/실패/접수/캐시/데이터/안전 경계 포함.
+- [ ] 전체 필수 검사·리뷰 통과 후 병합·배포. 브라우저 실험과 전체 회귀를 겹치지 않음.
+- [ ] 동일 자연어 질문 새 임시 대화2건. 각 응답의 공개 href와 수량을 대조하고 실패도 보존. PROJECT.md 결과 기록.
diff --git a/docs/superpowers/specs/2026-11-02-discovery-web-entry-design.md b/docs/superpowers/specs/2026-11-02-discovery-web-entry-design.md
new file mode 100644
index 00000000..1a76b274
--- /dev/null
+++ b/docs/superpowers/specs/2026-11-02-discovery-web-entry-design.md
@@ -0,0 +1,11 @@
+# 자연어 발견 이후 웹 조회 입구 설계
+
+목표: 주소 없는 ChatGPT 첫 질문에서 최신 실행 경로를 발견하기 쉽게 하고 실제 새 임시 대화로 검증한다.
+
+관측: 이전 동일 질문2건 실패 이후 오늘 수정 전 표본1건은45.1초에 성공했다. 실제 새 작업 결과 HTML을 별도 읽기로 대조했다. 실패의 서버 오류 원문은 없어 DNS/WAF 원인으로 단정하지 않는다. 웹 읽기 저장소 사본은 최신 원문과 달리 안내.2였고, 외부 미러 검색 결과에는 오래된 POST/셸 예제가 남아 있다.
+
+확인한 로컬 문제: README의 주요 시작 링크는 MCP 연결 설정으로 향한다. 공식 루트는 실제 조회 링크 앞에 긴 복구 규칙을 둔다. docs/web-discovery.md에는 옛 안내 버전이 현재 버전이라고 남아 있다.
+
+수정: README의 접힌 AI 안내·이미지·배지는 보존하고 사람에게 보이는 첫 시작 링크를 ChatGPT HTML 조회로 연결한다. 원격 MCP 연결은 병렬 선택지로 유지한다. 공식 루트는 짧은 웹 조회 설명과 실제 시작 링크를 긴 규칙/프로토콜 설명보다 먼저 제공한다. 새 도구/새 조회 API/서버 권한 변경은 없다. 현재 안내는.4로 통일하고 상세 문서는 최신 연결을 기준으로 쓴다.
+
+검증: 링크 순서/실제 href/문서 버전 계약 회귀를 먼저 실패시킨다. 전체 CI/Coverage100%/CodeQL/리뷰 후 병합·배포한다. 같은 주소 없는 최초 질문을 새 임시 대화2건에서 직렬 실행하며 성공·실패·시간·실제 href·작업 결과/독립API대조를 기록한다. 성공을 확보해도 검색 사본과 모델 선택의 보편적 해결로 일반화하지 않는다.
diff --git a/docs/web-discovery.md b/docs/web-discovery.md
index b38597a3..9b70a9fd 100644
--- a/docs/web-discovery.md
+++ b/docs/web-discovery.md
@@ -6,7 +6,7 @@
웹 도구의 `Crawled: today`만으로 현재 재고라고 단정하지 마세요. 응답의 HTML 생성 시각과 실제 수량을 확인하고, 수량이 null이면 품절이 아닌 미확인으로 보고합니다.
-[공개 첫 화면](https://mcp.aka.page/)은 설치 없는 사용 방법과 첫 실제 조회 링크를 HTML로 제공합니다. 웹 읽기 기능만으로 MCP 도구가 자동 등록되는 것은 아닙니다. 연결된 MCP 도구를 먼저 사용하고, 없으면 실제 브라우저, 그다음 웹 읽기의 HTML GET을 사용합니다. 모든 수단이 없거나 실패하면 실제 조회 도구 제약을 알리며 셸 호출로 우회하지 않습니다. 웹 읽기는 응답의 실제 링크 ID를 click하고 검색어·지역은 글자 링크로 입력합니다. 새 URL을 조립하지 않습니다.
+[공개 첫 화면](https://mcp.aka.page/)은 설치 없는 사용 방법과 첫 실제 조회 링크를 HTML로 제공합니다. 웹 읽기 기능만으로 MCP 도구가 자동 등록되는 것은 아닙니다. 연결된 MCP 도구를 먼저 사용하고, 없으면 실제 브라우저, 그다음 웹 읽기의 HTML GET을 사용합니다. 모든 수단이 없거나 실패하면 실제 조회 도구 제약을 알리며 셸 호출로 우회하지 않습니다. 웹 읽기는 응답의 실제 링크 ID를 click하고 검색어·지역은 빠른 링크를 우선 선택하고 목록 밖 입력만 글자 링크를 씁니다. 새 URL을 조립하지 않습니다.
- `/`: HTML 안내. `Accept: application/json`이면 기존 서버 정보 JSON.
- `/root.json`: 현재 서비스·도구 목록 JSON. API 클라이언트는 이 명시적 주소를 권장합니다.
@@ -59,12 +59,16 @@ HTML은 원래 응답의 성공·오류와 HTTP 상태를 보존합니다. 상
## 안내 버전과 상품 이미지 카드
-현재 안내 버전은 `2026-10-26.1`, 갱신일은 `2026-10-26`입니다. README의 AI 안내, 첫 화면, llms.txt, prompt와 HTML 조회 결과에 표시합니다. 버전이 없거나 다르면 예전 검색 사본일 수 있으므로 실제 읽은 URL과 문구를 확인하고 최신 버전을 읽었다고 추정하지 않습니다. 검색 엔진의 재수집·캐시 반영 시각은 이 배포로 보장하지 않습니다.
+현재 안내 버전과 갱신일은 [최신 공식 안내](https://mcp.aka.page/guide/latest)에서 확인합니다. 고정 버전을 이 문서에 복제하지 않습니다. README의 AI 안내, 첫 화면, llms.txt, prompt와 HTML 조회 결과에 표시합니다. 버전이 없거나 다르면 예전 검색 사본일 수 있으므로 실제 읽은 URL과 문구를 확인하고 최신 버전을 읽었다고 추정하지 않습니다. 검색 엔진의 재수집·캐시 반영 시각은 이 배포로 보장하지 않습니다.
상품 HTML은 이름·ID·원본 필드와 응답 imageUrl의 이미지를 같은 카드에 표시합니다. 이미지 링크는 원본 URL의 쿼리까지 유지하며 HTTPS이고 인증정보가 없는 주소만 사용합니다. imageUrl이 없거나 안전한 이미지 주소가 아니면 이미지 없음으로 표시합니다. 검색 이미지로 채우지 않습니다. JSON API 필드와 오류 상태는 유지합니다.
## 최신 안내의 연결 계약
-`/guide/latest` 및 이전 `/guide/버전`은 307과 Cache-Control: no-store로 현재 `/guide/2026-10-26.1`에 연결합니다. 새 버전 배포 시 공통 상수와 README·스킬 안내를 함께 갱신합니다. 첫 화면·robots·sitemap도 같은 상수의 현재 경로를 안내합니다. 외부 캐시가 과거 응답이나 리다이렉트를 재사용하는 것까지 강제할 수는 없습니다.
+`/guide/latest` 및 이전 `/guide/버전`은 307과 Cache-Control: no-store로 공통 상수의 현재 버전 경로에 연결합니다. 새 버전 배포 시 공통 상수와 README·스킬 안내를 함께 갱신합니다. 첫 화면·robots·sitemap도 같은 상수의 현재 경로를 안내합니다. 외부 캐시가 과거 응답이나 리다이렉트를 재사용하는 것까지 강제할 수는 없습니다.
첫 HTML 조회와 상세·재고·페이지 이동 링크는 쿼리 없는 `/browse/` 경로입니다. 프롬프트의 웹 GET 예제도 같은 경로를 사용하며 안내 버전은 `/guide/latest`에서 확인합니다. 안내와 HTML 결과는 no-store를 보내며 기존 JSON/API 원본 캐시 정책은 유지합니다. 이미지 카드에는 원본 imageUrl로 생성한 Markdown을 제공하고 이미지 검색/image_query/캐러셀 대체를 금지합니다. 표시가 불가능하면 원본 링크와 텍스트만 제공합니다.
+
+## 구현·평가 에이전트 인수인계
+
+회사에서 유사한 HTML 조회를 제공할 때는 [ChatGPT Chat 제공 지침](chat-web-read-mcp-playbook.md)을 참고합니다. 관측·가설·권고와 실제 새 대화의 평가 조건을 구분합니다.
diff --git a/skills/daiso-cli/SKILL.md b/skills/daiso-cli/SKILL.md
index d652808f..d7c9f958 100644
--- a/skills/daiso-cli/SKILL.md
+++ b/skills/daiso-cli/SKILL.md
@@ -29,7 +29,7 @@ Use this skill to operate the Daiso MCP project through `npx daiso` and the publ
## 설치 없이 첫 조회
-최신 서버 안내는 [현재 버전](https://mcp.aka.page/guide/2026-11-02.3)과 [최신 연결](https://mcp.aka.page/guide/latest)에서 제공합니다. 웹 도구는 과거 리디렉션·수집본을 반환할 수 있으므로 표시된 버전과 HTML 생성 시각을 확인하세요.
+최신 서버 안내는 [현재 버전](https://mcp.aka.page/guide/2026-11-02.4)과 [최신 연결](https://mcp.aka.page/guide/latest)에서 제공합니다. 웹 도구는 과거 리디렉션·수집본을 반환할 수 있으므로 표시된 버전과 HTML 생성 시각을 확인하세요.
1. 연결된 MCP 도구가 있으면 `search_products`에 `{"service":"daiso","query":"수납박스","pageSize":3}`를 전달합니다.
2. 실제 브라우저 도구가 있으면 /browse/ HTML GET 주소를 열고 실제 상품·매장·재고를 읽습니다. Work의 내장 브라우저도 사용 가능합니다.
diff --git a/src/pages/agentStart.ts b/src/pages/agentStart.ts
index 168ec249..248d5f80 100644
--- a/src/pages/agentStart.ts
+++ b/src/pages/agentStart.ts
@@ -1,5 +1,5 @@
/** 검색·읽기 사본의 안내 세대를 구분하는 고정 버전 */
-export const AGENT_GUIDE_VERSION = '2026-11-02.3';
+export const AGENT_GUIDE_VERSION = '2026-11-02.4';
export const AGENT_GUIDE_UPDATED = '2026-11-02';
export const AGENT_GUIDE_STAMP = `안내 버전: ${AGENT_GUIDE_VERSION} · 갱신일: ${AGENT_GUIDE_UPDATED}`;
export const AGENT_GUIDE_PATH = `/guide/${AGENT_GUIDE_VERSION}`;
@@ -46,7 +46,7 @@ ${ROUTE_SELECTION_TEXT}
웹 읽기 시작 (문서의 실제 링크 ID를 선택):
${baseUrl}/browse/quick
-응답의 글자 입력 링크에서 임의 상품명·매장 지역을 선택하세요. 수납박스·핫식스 등 예제도 이 화면의 실제 링크로 조회합니다. 동일 주소의 수집본이 오래됐으면 새 응답 확인 링크를 선택하세요. 새 HTML 주소도 원본 API의 캐시를 사용하며 원본 재고의 새 갱신을 보장하지 않습니다.
+요청과 일치하는 빠른 상품명·지역 링크를 먼저 선택하고 목록 밖 입력만 글자 링크를 쓰세요. 수납박스·핫식스 등 예제도 이 화면의 실제 링크로 조회합니다. 동일 주소의 수집본이 오래됐으면 새 응답 확인 링크를 선택하세요. 새 HTML 주소도 원본 API의 캐시를 사용하며 원본 재고의 새 갱신을 보장하지 않습니다.
이것은 공개 REST GET의 웹 조회이며 MCP 프로토콜 호출이 아닙니다. 상품 결과의 실제 매장 지역 선택 링크를 바로 따르세요. 상세 정보가 필요할 때만 상품 상세를 여세요. 지역 입력 후 표시된 실제 재고 조회 링크를 선택합니다. 후속 URL을 새로 조립하지 마세요. 상품 검색만으로 매장 재고를 단정하지 마세요. 일반 API 클라이언트의 경로·필터 문법은 상세 사용 안내를 참고하세요.
${IMAGE_SOURCE_RULE}
diff --git a/src/pages/discovery.ts b/src/pages/discovery.ts
index d22c0683..168bac67 100644
--- a/src/pages/discovery.ts
+++ b/src/pages/discovery.ts
@@ -39,9 +39,9 @@ export function buildDiscoveryAssets(info: {
DAISO MCP
${escapeHtml(AGENT_GUIDE_STAMP)} · 현재 버전 안내 · 항상 최신 안내로 이동
설치 없이 상품·매장·재고와 영화관 정보를 조회하세요. 사용자 API 키나 로그인 없이 쓸 수 있는 공개 서비스입니다.
${escapeHtml(WEB_SEARCH_DESCRIPTION)}
-${escapeHtml(WEB_READ_RULE)}
-바로 조회하기
상품·매장·재고 웹 조회 시작
빠른 상품 검색과 지역 선택에서 요청과 일치하는 단어를 통째로 선택하세요. 목록 밖 입력만 글자 링크를 쓰고 재고가 목적이면 상품 카드의 매장 지역 선택을 바로 여세요. 이전 HTML은 같은 조건으로 새 응답 확인 링크로 구분합니다. 원본 API 캐시는 유지됩니다.
+ChatGPT에서 바로 조회하기
상품·매장·재고 웹 조회 시작
빠른 상품 검색과 지역 선택에서 요청과 일치하는 단어를 통째로 선택하세요. 목록 밖 입력만 글자 링크를 쓰고 재고가 목적이면 상품 카드의 매장 지역 선택을 바로 여세요. 이전 HTML은 같은 조건으로 새 응답 확인 링크로 구분합니다. 원본 API 캐시는 유지됩니다.
위 링크는 셸·설치 없이 웹 읽기로 호출하는 공개 REST GET의 HTML 결과입니다. 모든 서비스의 /browse/ 경로는 자동 HTML이며 쿼리 문자열은 필요 없습니다. 검색한 상품의 실제 ID로 재고를 조회하세요. 상품 검색만으로 매장 재고를 단정하지 마세요.
+${escapeHtml(WEB_READ_RULE)}
에이전트에서 설치 없이 사용하기
원격 MCP 주소: ${BASE}
전송: Streamable HTTP · 인증: 없음
${escapeHtml(ROUTE_SELECTION_TEXT).replaceAll('\n', '
')}
${escapeHtml(IMAGE_SOURCE_RULE)}
diff --git a/tests/pages/discoveryEntry.test.ts b/tests/pages/discoveryEntry.test.ts
new file mode 100644
index 00000000..940b2699
--- /dev/null
+++ b/tests/pages/discoveryEntry.test.ts
@@ -0,0 +1,24 @@
+import { readFileSync } from 'node:fs';
+import { expect, it } from 'vitest';
+import { buildDiscoveryAssets } from '../../src/pages/discovery.js';
+import { WEB_READ_RULE } from '../../src/pages/agentStart.js';
+
+it('공식 첫 화면은 연결 설정과 복구 규칙보다 웹 실행 입구를 먼저 제공한다', () => {
+ const html = buildDiscoveryAssets({ services: [], tools: [] })['discovery.html'];
+ const section = html.match(/([\s\S]*?)<\/section>/)?.[0];
+ expect(section).toBeDefined();
+ expect(section).toContain('href="/browse/quick"');
+ expect(html.indexOf(section!)).toBeLessThan(html.indexOf(WEB_READ_RULE));
+ expect(html.indexOf(section!)).toBeLessThan(html.indexOf('Streamable HTTP'));
+});
+
+it('접힌 AI 안내 밖의 첫 시작 선택지는 웹 조회이며 기존 이미지와 안내는 보존한다', () => {
+ const readme = readFileSync('README.md', 'utf8');
+ expect(readme).toMatch(/^\nAI 에이전트 사용 안내<\/summary>/);
+ const visible = readme.slice(readme.indexOf('
') + ''.length);
+ const first = [...visible.matchAll(/\*\*\[([^\]]+)\]\(([^)]+)\)/g)][0];
+ expect(first?.[1]).toBe('ChatGPT에서 바로 조회');
+ expect(first?.[2]).toBe('https://mcp.aka.page/browse/quick');
+ expect(visible).toContain('assets/daiso-mcp-services.png');
+ expect(visible).toContain('#원격-mcp로-바로-시작하기');
+});
diff --git a/tests/pages/latestGuide.test.ts b/tests/pages/latestGuide.test.ts
index 015fec50..fc68834b 100644
--- a/tests/pages/latestGuide.test.ts
+++ b/tests/pages/latestGuide.test.ts
@@ -4,7 +4,7 @@ import app from '../../src/index.js';
import { buildDiscoveryAssets } from '../../src/pages/discovery.js';
import { apiResultHtml } from '../../src/pages/apiResult.js';
-const version = '2026-11-02.3';
+const version = '2026-11-02.4';
describe('최신 안내 경로와 원본 이미지', () => {
it.each(['/guide/latest', '/guide/2026-10-21.2', '/guide/unknown'])(
'%s는 캐시 없이 현재 버전으로 연결한다',
diff --git a/tests/pages/productCards.test.ts b/tests/pages/productCards.test.ts
index 4b8e3689..89e4b1ce 100644
--- a/tests/pages/productCards.test.ts
+++ b/tests/pages/productCards.test.ts
@@ -99,7 +99,7 @@ describe('실제 상품 이미지 카드', () => {
const assets = buildDiscoveryAssets({ services: [], tools: [] });
expect(assets['discovery.html']).toMatch(/name="description" content="ChatGPT.*browse\//);
for (const text of [assets['discovery.html'], buildAgentStartText('https://example.com')]) {
- expect(text).toContain('안내 버전: 2026-11-02.3');
+ expect(text).toContain('안내 버전: 2026-11-02.4');
expect(text).toContain('갱신일: 2026-11-02');
}
});
diff --git a/tests/scripts/repository-config.test.ts b/tests/scripts/repository-config.test.ts
index f205a19f..7caf4203 100644
--- a/tests/scripts/repository-config.test.ts
+++ b/tests/scripts/repository-config.test.ts
@@ -315,7 +315,7 @@ describe('repository maintenance configuration', () => {
expect(fastStart).toContain('설치·API 키 없이');
expect(fastStart).toMatch(/\| 인증\s*\| 없음\s*\|/);
expect(readme).toContain('로컬 설치·빌드·API 키 준비 없이');
- expect(fastStart).toContain('docs/service-reference.md?guide=2026-11-02.3#설치-없이-첫-조회');
+ expect(fastStart).toContain('docs/service-reference.md?guide=2026-11-02.4#설치-없이-첫-조회');
const directCall = readText('docs/service-reference.md').split('### MCP 표준 응답 모델')[0];
expect(directCall).toContain('WebFetch');
expect(directCall).toContain('/browse/daiso/products/');