diff --git a/docs/superpowers/plans/2026-10-27-web-read-real-links.md b/docs/superpowers/plans/2026-10-27-web-read-real-links.md new file mode 100644 index 00000000..e88bcbad --- /dev/null +++ b/docs/superpowers/plans/2026-10-27-web-read-real-links.md @@ -0,0 +1,11 @@ +# 문자 선택에서 실제 조회로 연결 + +목표는 가상 입력 성공을 실제 상품 조회 성공으로 확대하지 않고, 다음 실제 페이지까지 웹 도구가 이동 가능한지 확인하는 것입니다. + +- 완료 화면에 현재 문자열을 URL 인코딩한 기존 운영 상품·매장 조회 링크만 추가합니다. 상품 응답은3개로 제한합니다. +- Worker의 외부 요청, 인증, 저장 범위는 변경하지 않습니다. 링크 선택 전에는 실제 조회가 수행되지 않음을 표시합니다. +- 실제 링크 생성 회귀를 먼저 실패시키고, 변경 후 기존 실험·타입·필수 검사와 독립 리뷰를 수행합니다. +- 배포 후 새 실행 또는 새 완료 주소에서 실제 상품 검색 링크를 클릭하고 상품 ID·이름을 확인합니다. 서버 도구 성공과 가상 데이터 성공을 구분합니다. +- 재고 조회는 상품·지역 선택과 추가 검증이 필요하며 이번 변경만으로 해결됐다고 보고하지 않습니다. + +사전 근거: 링크만으로 `연필7` 및 `r9`를 만든 두 독립 실행에서 최종 requestId가 서버 로그와 일치했습니다. 전체 경과시간은 각각 약112초/81초였으나 Mac 실행·명령 지연이 함께 관측돼 웹 도구의 고정 지연으로 해석하지 않습니다. diff --git a/experiments/web-read-lab/README.md b/experiments/web-read-lab/README.md index 14f311ac..857c46e0 100644 --- a/experiments/web-read-lab/README.md +++ b/experiments/web-read-lab/README.md @@ -20,6 +20,8 @@ ## 실행 +입력 완료 화면의 실제 조회 링크는 별도 운영 서비스로 이동합니다. 실험 Worker 자체는 운영 API를 호출하지 않습니다. 사용자가 선택한 상품 검색은 최대3개 결과이며, 상품 검색 성공은 매장 재고 확인과 구분합니다. 이 경로의 실제 웹 도구 동작 여부도 서버 관측과 별도로 기록합니다. + 1. 실험 목록을 연 뒤 **새 실험 시작** 링크를 한 번 따라 다음 실행으로 이동합니다. 웹 읽기에서는 URL을 다시 조립하지 말고 실제 링크 ID로 click합니다. 직접 open 실패도 별도 조건으로 기록합니다. 새 링크는 문서를 새로 생성할 때 고유합니다. 웹 읽기가 캐시된 목록을 재사용하면 링크도 재사용되므로 독립 실행을 보장하지 않습니다. 이전에 본 실행번호이면 재사용하지 말고, 새로 열린 목록의 다음 링크를 한 번 따라가세요. 관측 기록에서 실행번호와 실제 신규 도착 시각을 대조하고 섞인 실행은 독립 표본에서 제외합니다. diff --git a/experiments/web-read-lab/composer.ts b/experiments/web-read-lab/composer.ts index 71b4bfac..54ae79a0 100644 --- a/experiments/web-read-lab/composer.ts +++ b/experiments/web-read-lab/composer.ts @@ -24,7 +24,8 @@ export function renderComposer(parts: string[], requestId: string): string | nul if (!text.trim()) return null; return ( intro + - `
${JSON.stringify({ synthetic: true, query: text, requestId, generatedAt: new Date().toISOString() }, null, 2)}
` + `
${JSON.stringify({ synthetic: true, query: text, requestId, generatedAt: new Date().toISOString() }, null, 2)}
` + + `

입력한 검색어로 실제 조회하기

아래 링크는 별도 운영 서비스로 이동합니다. 링크를 열기 전에는 실제 상품이나 매장을 조회한 것이 아닙니다. 상품 검색 성공은 매장 재고 보유를 뜻하지 않습니다.

${link('입력 수정', text)}

` ); } const choice = /^ko-(\d{1,2})(?:-(\d{1,2}))?$/.exec(stage); diff --git a/tests/scripts/web-read-lab.test.ts b/tests/scripts/web-read-lab.test.ts index 01b3353d..3dee55ab 100644 --- a/tests/scripts/web-read-lab.test.ts +++ b/tests/scripts/web-read-lab.test.ts @@ -48,6 +48,10 @@ describe('독립 웹 읽기 실험', () => { expect(body).toContain('연필7'); expect(body).toContain('synthetic'); expect(body).toContain('requestId'); + expect(body).toContain( + 'https://mcp.aka.page/browse/daiso/products/%EC%97%B0%ED%95%847/pageSize/3', + ); + expect(body).toContain('https://mcp.aka.page/browse/daiso/stores/%EC%97%B0%ED%95%847'); const log = JSON.stringify(await (await get('/observations/compose-test')).json()); expect(log).not.toContain('연필'); });