# editorial 보고서 첫 방문 하이라이트 온보딩 PRD

> 문서 상태: 기획 확정
> 작성일: 2026-07-15
> 대상 화면: 분석 완료 보고서
> 대상 사용자: 보고서 페이지에 처음 진입한 사용자
> 구현 단계: 정적 프로토타입 검증 완료, 실제 제품 적용 전환 필요

## Problem Statement

### 사용자 문제

분석이 끝난 보고서에는 제안별 포함·제외, 스타일 분석 보기, 다운로드처럼 서로 다른 목적의 핵심 기능이 함께 노출된다. 그러나 보고서를 처음 보는 사용자는 각 기능이 어떤 순서로 이어지는지, 특히 포함·제외가 무엇을 바꾸는지 즉시 이해하기 어렵다.

가장 큰 오해는 기존 승인·무시 명칭이 만든 의미다.

- **승인**을 누르면 업로드한 원고 원본이 즉시 수정된다고 생각할 수 있다.
- **무시**는 단순히 제안을 화면에서 숨기는 기능이라고 생각할 수 있다.
- 제안별 포함·제외 상태가 다운로드할 보고서에 반영된다는 사실을 놓칠 수 있다.
- 스타일 분석을 단순 통계로 오해해 editorial이 어떤 기준과 근거로 작업했는지 확인하지 못할 수 있다.
- 다운로드를 누르기 전에 제안 상태와 파일 종류를 선택할 수 있다는 점을 알기 어렵다.

모든 제안 카드에 설명을 상시 노출하면 긴 보고서를 빠르게 훑는 경험이 산만해진다. 반대로 설명을 제공하지 않으면 사용자는 핵심 작업 방식을 이해하지 못한 채 보고서를 이탈하거나 잘못된 기대를 갖게 된다.

### 제품 문제

- 첫 보고서 진입 이후 핵심 기능 발견과 첫 행동 사이의 학습 비용이 높다.
- 기존 승인·무시 명칭의 잘못된 해석은 원고 원본이 변경된다는 불안으로 이어질 수 있다.
- 스타일 분석과 다운로드가 서로 분리된 부가 기능처럼 보일 수 있다.
- 도움말을 별도 문서로 제공하면 실제 컨트롤과 설명이 분리되어 학습 전환이 낮아진다.
- 하이라이트 전환 과정에서 스크롤바가 사라졌다 나타나거나 화면이 깜빡이면 제품 신뢰가 떨어진다.

### 해결해야 할 핵심 질문

1. 첫 사용자가 보고서에서 가장 먼저 해야 할 세 가지 행동을 어떻게 짧게 가르칠 것인가?
2. 원고 원본은 바뀌지 않고 다운로드 결과에만 판단이 반영된다는 점을 어떻게 오해 없이 설명할 것인가?
3. 사용자의 현재 작업을 방해하지 않으면서 실제 컨트롤과 설명을 어떻게 연결할 것인가?
4. 데스크톱과 모바일에서 스크롤 이동·하이라이트·포커스를 어떻게 안정적으로 유지할 것인가?
5. 실제 제품의 최초 1회 노출과 프로토타입의 반복 테스트 요구를 어떻게 분리할 것인가?

## Solution

보고서 페이지에 처음 진입한 사용자를 대상으로 실제 컨트롤을 순서대로 강조하는 3단계 하이라이트 온보딩을 제공한다.

온보딩은 다음 작업 흐름을 가르친다.

1. 제안마다 다운로드할 보고서에 포함하거나 제외할지 판단한다.
2. 스타일과 editorial의 작업 근거를 확인한다.
3. 검토 상태와 파일 종류를 선택해 결과를 다운로드한다.

### 단계별 콘텐츠

| 단계 | 강조 대상 | 제목 | 본문 | 보충 설명 |
|---|---|---|---|---|
| 1 | 현재 보이는 첫 미처리 제안의 포함·제외 버튼 묶음 | 제안마다 판단해 주세요 | 각 제안을 다운로드할 보고서에 포함하거나 제외할 수 있습니다. | 원고 원본은 변경되지 않습니다. |
| 2 | 스타일 분석 보기 버튼 | 스타일과 작업 근거를 확인하세요 | 용어집과 문체 특징을 한눈에 모아 보고, editorial이 어떤 기준과 근거로 교정 작업을 했는지 확인할 수 있습니다. | 없음 |
| 3 | 다운로드 버튼 | 검토 결과를 파일로 받으세요 | 제안의 포함·제외 상태는 원고 원본이 아닌 다운로드할 보고서에만 반영됩니다. 원하는 검토 상태와 파일 종류를 선택해 다운로드하세요. | 없음 |

### 경험 원칙

1. **실제 컨트롤을 가리킨다.** 별도 튜토리얼 화면이 아니라 사용자가 곧 사용할 보고서 위에서 안내한다.
2. **편집자의 판단을 중심에 둔다.** 포함·제외는 editorial이 대신 확정하는 행동이 아니라 사용자가 내리는 보고서 구성 판단으로 설명한다.
3. **원고 원본과 다운로드 결과를 구분한다.** 어떤 카피도 원고 원본이 즉시 수정된다고 암시하지 않는다.
4. **짧고 순차적으로 가르친다.** 한 단계에는 하나의 핵심 개념만 배치한다.
5. **사용자의 작업을 가로채지 않는다.** 시작 전 사용자 입력이 감지되면 늦게 다시 나타나지 않는다.
6. **화면을 움직여도 흔들리지 않는다.** 단계 전환 중 스크롤바, 딤, 패널, 하이라이트 위치가 깜빡이지 않아야 한다.
7. **다시 볼 수 있다.** 자동 노출이 끝난 뒤에도 사용자가 더보기 메뉴에서 다시 실행할 수 있다.

### 목표

- 첫 사용자가 포함·제외의 다운로드 보고서 구성 의미를 이해한다.
- 첫 사용자가 원고 원본이 변경되지 않는다는 점을 이해한다.
- 첫 사용자가 스타일 분석에서 용어집·문체와 editorial의 작업 근거를 확인할 수 있음을 안다.
- 첫 사용자가 다운로드 전에 제안 상태와 파일 종류를 선택할 수 있음을 안다.
- 가이드 완료 또는 건너뛰기 이후 사용자가 원래 보고서 작업으로 안전하게 돌아간다.
- 데스크톱·모바일·동작 줄이기 환경에서 시각적 깜빡임이나 레이아웃 이동 없이 동작한다.

### 성공 지표

출시 전 이벤트 수집을 먼저 보장하고, 수치 목표는 실제 기준선 확보 후 설정한다.

- **report_guide_started** 대비 **report_guide_completed** 비율
- 단계별 이탈률과 건너뛰기 단계 분포
- 가이드 이후 같은 세션에서 첫 포함 또는 제외를 수행한 비율
- 가이드 이후 같은 세션에서 스타일 분석을 연 비율
- 가이드 이후 같은 세션에서 다운로드를 시작한 비율
- 더보기 메뉴를 통한 다시 보기 비율
- 온보딩 노출 사용자의 보고서 이탈률 변화
- 포함·제외 의미와 관련된 문의 또는 오류 피드백 변화

## User Stories

1. As a first-time report user, I want the report to point out the most important controls, so that I can start reviewing without reading a separate manual.
2. As an editor, I want to understand that including a suggestion affects only the downloaded report, so that I do not mistake it for an immediate source-manuscript edit.
3. As an editor, I want to understand that excluded suggestions are omitted from the downloaded report, so that I can make intentional review decisions.
4. As an editor, I want an explicit statement that the original manuscript is not changed, so that I can review suggestions without fear of losing the source.
5. As an editor, I want include and exclude explained together, so that I understand them as two states in the same review workflow.
6. As a first-time report user, I want the first guide step attached to a real pending suggestion, so that the explanation is connected to an action I can perform.
7. As a report user with no pending suggestions, I want the unavailable step to be skipped, so that the guide does not point to a missing control.
8. As a report user with no pending suggestions, I want to be told why the first step was skipped, so that the shorter guide does not feel broken.
9. As an editor, I want to learn that style analysis gathers glossary and writing-style information, so that I can review consistency beyond individual suggestions.
10. As an editor, I want to understand that style analysis exposes editorial's criteria and rationale, so that I can evaluate why the work was performed.
11. As an editor, I want to learn that download includes selection of review states and file types, so that I know what to expect before opening the download dialog.
12. As a first-time report user, I want one concept per step, so that I can understand the guide without stopping my review for long.
13. As a report user, I want to move backward and forward between steps, so that I can reread an explanation I missed.
14. As a report user, I want to skip the guide at any time, so that I retain control over my work.
15. As a keyboard user, I want Escape to behave like skip, so that I can dismiss the guide without finding a pointer target.
16. As a report user, I want the final action to close the guide and focus the download button without opening it, so that I choose when to start the download flow.
17. As a report user, I want clicking outside the guide not to dismiss it accidentally, so that an unintended click does not interrupt learning.
18. As a report user, I want highlighted controls blocked during the guide, so that I do not trigger a real action while trying to understand the explanation.
19. As a user who already started interacting with the report, I do not want a delayed automatic guide to appear, so that my current task is not interrupted.
20. As a user with an open modal, popover, notification panel, or mobile drawer, I do not want the guide to start, so that overlays do not compete.
21. As a returning user, I want to reopen the guide from the report menu, so that I can refresh my understanding when needed.
22. As a mobile user, I want the explanation in a bottom sheet and the target above it, so that the highlighted control is not covered.
23. As a desktop user, I want the panel placed near the highlighted control without covering it, so that the relationship is visually clear.
24. As a user on a short viewport, I want the page to scroll to a safe target position, so that both the target and the guide remain readable.
25. As a user sensitive to motion, I want reduced-motion preferences respected, so that the guide does not use unnecessary smooth movement.
26. As a user on Windows with a persistent scrollbar, I want the page width to remain unchanged, so that the report does not jump between steps.
27. As a keyboard user, I want focus trapped inside the guide while it is open, so that I do not navigate into blocked background content.
28. As a screen-reader user, I want the dialog title, description, progress, and step changes announced, so that I receive the same guidance as a visual user.
29. As a product analyst, I want start, step view, dismissal, completion, replay, and follow-up actions measured, so that I can evaluate whether the guide improves activation.
30. As a QA tester, I want to force a specific guide step without changing storage or analytics, so that I can reproduce each visual state reliably.
31. As a QA tester using the static prototype, I want the guide to appear on every report entry even after completion or dismissal, so that repeated testing does not require clearing browser storage.
32. As a product user in production, I want the automatic guide shown only once per user and guide version, so that it does not become recurring friction.
33. As a frontend developer, I want guide persistence behind a storage adapter, so that browser storage in the prototype can be replaced with account-level persistence in production.
34. As a frontend developer, I want target discovery separated from guide rendering, so that missing or filtered controls can be handled without corrupting the flow.
35. As a frontend developer, I want scrolling considered complete only after observable settlement, so that the highlight is measured against the final target position.
36. As a product owner, I want guide copy and implementation decisions maintained in the report specification, so that the runtime and planning surfaces do not drift.

## Implementation Decisions

### 1. 제품 범위와 노출 정책

- 가이드는 분석 완료 보고서 화면에서만 동작한다.
- 실제 제품의 자동 노출 원칙은 사용자·가이드 버전별 최초 1회다.
- 완료 또는 건너뛰기 이후에도 보고서 더보기 메뉴에서 수동으로 다시 볼 수 있다.
- 정적 프로토타입은 반복 테스트 모드를 켠다. 저장된 **seenAt**, **completedAt**, **dismissedAt** 값은 유지하되 자동 시작 판단에서는 무시한다.
- 실제 제품 출시 전 반복 테스트 플래그를 반드시 끈다.
- QA는 **?reportGuide=1**, **?reportGuide=2**, **?reportGuide=3**으로 단계를 강제할 수 있다.
- QA 강제 모드는 저장 상태와 제품 측정 이벤트를 변경하지 않는다.

### 2. 자동 시작 시점

- 레이아웃과 폰트가 안정된 뒤 자동 시작을 한 번만 시도한다.
- 준비 후 600~900ms 안에 시작하며 현재 기본값은 700ms다.
- 시작 창이 열린 뒤 1.5초가 지나면 늦게 시작하지 않는다.
- 활성화 전 pointer, keyboard, wheel, touch 입력이 감지되면 자동 시작을 취소한다.
- 문서가 보이지 않는 상태에서는 시작하지 않는다.
- 다른 모달, 팝오버, 알림 패널, 검색 레이어, 모바일 드로어가 열려 있으면 시작하지 않는다.
- 취소 또는 억제된 시도는 가이드를 본 것으로 기록하지 않는다.
- 사용자 입력으로 취소된 뒤 같은 방문에서 다시 자동 실행하지 않는다.

### 3. 단계 구성과 대상 탐색

- 대상은 페이지 초기 로드가 아니라 가이드 시작 시점에 찾는다.
- 포함·제외 대상은 현재 화면에 보이는 첫 미처리 제안의 액션 묶음이다.
- 대상을 만들기 위해 필터를 초기화하거나 사용자의 보고서 상태를 바꾸지 않는다.
- 보이는 미처리 제안이 없으면 1단계를 제외하고 스타일 분석부터 시작한다.
- 1단계를 제외한 경우 첫 패널에 **현재 처리할 제안이 없어 포함·제외 안내는 생략했습니다.**를 한 번 노출한다.
- 스타일 분석 또는 다운로드 대상이 없으면 해당 단계를 제외한다.
- 유효한 단계가 하나도 없으면 가이드를 열지 않는다.
- 진행 중 대상이 DOM에서 사라지면 target-missing 사유로 안전하게 종료한다.

### 4. 상호작용 모델

- 가이드는 네 개의 딤 영역, 대상 클릭 차단 영역, 하이라이트 링, 대화상자 패널로 구성한다.
- 가이드가 활성화된 동안 배경 보고서는 inert 상태다.
- 강조 컨트롤은 보이지만 실제 동작시킬 수 없다.
- 딤 영역을 클릭해도 종료되지 않는다.
- 패널 컨트롤은 진행 표시, **건너뛰기**, **이전**, **다음**이다.
- 첫 단계에서는 **이전**을 숨긴다.
- 마지막 기본 버튼은 **직접 사용해보기**로 바꾼다.
- **직접 사용해보기**는 가이드를 닫고 페이지 상태를 복원한 뒤 다운로드 버튼에 포커스를 둔다. 다운로드 모달은 자동으로 열지 않는다.
- Escape는 **건너뛰기**와 동일하다.
- 다시 보기에서 종료하면 더보기 메뉴 트리거로 포커스를 복원한다.
- 그 외 종료에서는 가능한 경우 마지막 강조 컨트롤로 포커스를 복원한다.

### 5. 데스크톱과 모바일 배치

- 데스크톱에서는 공간이 충분하면 대상 아래, 부족하면 대상 위에 패널을 배치한다.
- 패널과 뷰포트 사이에 최소 16px 여백을 둔다.
- 위아래 모두 맞지 않으면 안전 뷰포트 안에서 세로 중앙에 배치한다.
- 모바일에서는 패널을 하단 시트로 제공한다.
- 모바일 좌우 여백은 12px다.
- 모바일 패널 높이는 화면의 최대 42%이면서 320px을 넘지 않는다.
- 강조 대상은 모바일 시트의 안전 경계보다 최소 24px 위에 위치시킨다.
- resize, orientationchange, visual viewport resize 때 위치를 다시 계산한다.
- 모바일 가이드 컨트롤의 조작 영역은 최소 44px다.

### 6. 스크롤과 깜빡임 안정성

- 가이드 시작 시 페이지 스크롤을 한 번 잠그고 종료 시 한 번만 해제한다.
- 단계 전환 중 잠금을 풀었다가 다시 걸지 않는다.
- 보고서 루트의 스크롤바 공간을 안정적으로 예약한다.
- stable gutter를 지원하지 않는 환경에서는 잠금 전 스크롤바 너비만큼 body 우측 여백을 보정한다.
- 단계 전환 내내 전체 딤을 유지한다.
- 단계 사이에서 가이드 루트 opacity를 0으로 내리지 않는다.
- 대상 이동 중에는 하이라이트 링만 숨긴다.
- 이동 중 기존 패널은 유지하고 이전·다음 버튼을 잠시 비활성화한다.
- 고정 시간 지연으로 스크롤 완료를 추정하지 않는다.
- 브라우저 scroll-end 신호를 우선 사용하고 animation frame으로 정착을 검증한다.
- fallback 정착 조건은 이동량 0.5px 이하인 프레임이 3회 연속 발생하는 것이다.
- 최대 정착 대기는 일반 모션 1초, 동작 줄이기 180ms다.
- 정착 후 대상 측정, 링·패널 배치, 단계 카피 갱신, 단계 안내, 컨트롤 활성화 순으로 완료한다.
- transition token 또는 동등한 취소 방식으로 오래된 callback을 무시한다.

### 7. 접근성

- 패널은 modal dialog 의미를 사용한다.
- 대화상자와 화면에 보이는 제목·설명을 연결한다.
- 대상이 정착한 뒤 단계 진행과 내용을 polite live region으로 알린다.
- 활성 상태에서 포커스를 패널 안에 가둔다.
- 숨김 또는 비활성 컨트롤은 포커스 순환에서 제외한다.
- 배경 애플리케이션을 inert 처리하고 종료 시 기존 inert 상태를 복원한다.
- 위치를 바꾸는 동안 aria-busy 상태를 사용한다.
- **prefers-reduced-motion**을 존중해 즉시 이동한다.
- 가이드 조작 영역은 최소 44px을 유지한다.
- 딤, 본문, 버튼, 하이라이트 링은 충분한 색 대비를 유지한다.

### 8. 저장 계약

가이드 상태는 버전 단위이며 다음 논리 구조를 가진다.

    GuideState
    ├─ version
    ├─ seenAt
    ├─ completedAt
    └─ dismissedAt

- **seenAt**은 자동 가이드의 첫 단계가 실제로 표시되었을 때 기록한다.
- **completedAt**은 마지막 CTA를 선택했을 때 기록한다.
- **dismissedAt**은 건너뛰기 또는 Escape로 종료했을 때 기록한다.
- 브라우저 저장소는 프로토타입 구현으로 허용한다.
- 실제 제품은 **getState(version)**와 **setState(version, state)**를 제공하는 계정 저장 어댑터를 사용한다.
- 사용자와 가이드 버전 구분은 계정 저장 어댑터가 책임진다.
- 저장 실패는 가이드 실행을 막지 않으며 현재 페이지 메모리로 fallback한다.
- 다시 보기는 저장 상태에 의존하지 않는다.
- preview 모드는 저장 상태를 변경하지 않는다.

### 9. 측정 계약

| 이벤트 | 발생 시점 | 필수 맥락 |
|---|---|---|
| **report_guide_started** | 자동 또는 다시 보기 가이드 시작 | guide version, origin, storage scope, step count |
| **report_guide_step_viewed** | 정착된 단계가 표시됨 | origin, step id, step index, step count |
| **report_guide_dismissed** | 건너뛰기, Escape, 안전 종료 | origin, reason, current step id |
| **report_guide_completed** | 마지막 CTA 선택 | origin, step count |
| **report_guide_reopened** | 더보기에서 다시 보기 시작 | origin |
| **report_guide_outcome** | 가이드 이후 첫 핵심 행동 | outcome type, action context |

가이드 이후 outcome 유형:

- 첫 포함 또는 제외
- 스타일 분석 열기
- 다운로드 시작

Preview 모드는 제품 이벤트를 보내지 않는다.

### 10. 모듈 경계

실제 제품으로 옮길 때 다음 모듈 경계를 사용한다.

1. **Guide orchestrator**
   - 생명주기, 현재 단계, 실행 origin, 포커스 복원, 완료, 종료를 담당한다.
   - 작은 start, replay, finish 인터페이스를 제공한다.

2. **Step and target resolver**
   - 현재 보고서 상태에서 유효한 단계 목록을 만든다.
   - 대상 누락과 미처리 제안 없음 규칙을 캡슐화한다.

3. **Viewport coordinator**
   - 안전 영역, 스크롤 정착, 대상 측정, 링 배치, 반응형 패널 배치를 담당한다.
   - target과 viewport fixture로 독립 테스트할 수 있다.

4. **Persistence adapter**
   - 브라우저, 계정, 메모리 저장소 차이를 버전 상태 인터페이스 뒤에 숨긴다.

5. **Analytics adapter**
   - UI 렌더링을 특정 분석 도구와 결합하지 않고 생명주기와 outcome 이벤트를 전달한다.

6. **Guide presentation**
   - dialog markup, 카피, 딤, 링, 반응형 스타일, 동작 줄이기, transition 상태를 담당한다.

### 11. 인수 조건

#### 기능

- 유효한 자동 가이드가 예상 순서로 표시된다.
- 포함·제외 카피가 다운로드할 보고서를 명시한다.
- 1단계에 **원고 원본은 변경되지 않습니다.**가 표시된다.
- 스타일 분석 카피가 용어집, 문체, editorial의 기준과 근거를 명시한다.
- 마지막 CTA가 가이드를 닫고 다운로드에 포커스를 두되 모달을 열지 않는다.
- 건너뛰기와 Escape가 모두 가이드를 닫는다.
- 저장 상태와 무관하게 다시 보기가 동작한다.
- 미처리 제안이 없으면 안내가 포함된 2단계 가이드가 유효하게 동작한다.
- preview query가 저장이나 측정 변경 없이 요청된 유효 단계를 연다.

#### 시각과 상호작용

- 단계 전환 전·중·후 **documentElement.clientWidth**가 변하지 않는다.
- 활성 단계 전환 중 가이드 루트 opacity가 1을 유지한다.
- 대상 이동 중 하이라이트 링은 보이지 않는다.
- 정착 후 링과 대상의 최대 위치 오차는 1px 이하다.
- 링 노출 후 추가 스크롤은 0.5px 이하다.
- 스크롤 잠금 상태는 시작 시 1회, 종료 시 1회만 변경된다.
- 모바일 패널은 강조 대상을 가리지 않고 최소 24px 안전 거리를 확보한다.
- 가이드 중 배경과 강조 컨트롤은 실제 동작하지 않는다.

#### 접근성

- 키보드 포커스가 활성 가이드 밖으로 나가지 않는다.
- Escape로 종료할 수 있다.
- 단계 진행과 새 내용은 대상 정착 후 안내된다.
- 배경 inert 상태와 포커스가 올바르게 복원된다.
- 동작 줄이기에서는 smooth scroll 없이 완료된다.

#### 상태와 측정

- 실제 제품 모드는 사용자·가이드 버전별 최초 1회 자동 표시한다.
- 프로토타입 반복 테스트 모드는 완료 또는 건너뛰기 후에도 보고서 진입마다 표시한다.
- 저장 실패가 가이드 실행을 막지 않는다.
- 생명주기와 outcome 이벤트가 필수 맥락을 포함한다.
- preview 모드는 저장과 측정을 모두 변경하지 않는다.

## Testing Decisions

### 테스트 원칙

- 내부 함수명이나 CSS 구현이 아니라 외부에서 관찰 가능한 동작을 테스트한다.
- 스크롤과 레이아웃은 실제 Chromium 브라우저에서 검증한다.
- 고정된 viewport와 명시적 preview 입력을 사용한다.
- dialog 존재만 확인하지 않고 가이드 전·중·후의 보고서 동작을 검증한다.
- 저장, 대상 탐색, 측정 계약은 독립 테스트 가능하게 유지한다.

### 단위 수준 범위

1. **Step resolver**
   - 미처리 제안 있음
   - 미처리 제안 없음
   - 필터로 숨겨진 미처리 제안
   - 스타일 대상 없음
   - 다운로드 대상 없음
   - 유효 대상 없음

2. **Persistence adapter**
   - 빈 상태 정규화
   - 버전 불일치 초기화
   - 브라우저 저장소 읽기·쓰기
   - 계정 어댑터 성공
   - 계정 어댑터 실패 fallback
   - preview 읽기와 쓰기 없음

3. **Analytics adapter**
   - 필수 이벤트명과 payload
   - outcome 유형별 최초 1회
   - preview 제품 이벤트 없음

4. **Viewport coordinator**
   - 데스크톱 상단·하단 패널 배치
   - 모바일 안전 영역
   - 스크롤이 필요 없는 대상
   - smooth scroll이 필요한 대상
   - 동작 줄이기 대상
   - timeout fallback
   - 오래된 transition 취소

### 브라우저 통합 범위

필수 viewport matrix:

| 시나리오 | Viewport | Motion |
|---|---:|---|
| 짧은 데스크톱 | 1280×500 | normal |
| 표준 데스크톱 | 1280×720 | normal |
| 모바일 | 390×844 | normal |
| 동작 줄이기 | 1280×500 | reduce |

필수 흐름:

1. 3단계 전체 완료
2. 이전·다음 왕복
3. 버튼으로 건너뛰기
4. Escape로 건너뛰기
5. 완료 후 다운로드 포커스와 모달 미실행
6. 미처리 제안이 없을 때 포함·제외 단계 제외
7. 시작 전 사용자 입력으로 자동 시작 취소
8. 다른 overlay가 열린 상태에서 자동 시작 억제
9. 더보기 메뉴에서 다시 보기
10. 각 preview query 강제 상태
11. 완료·건너뛰기 상태를 넣고 프로토타입 반복 노출 확인
12. 반복 테스트 모드를 끄고 실제 제품 1회 노출 확인
13. 활성 상태에서 resize와 orientation change
14. focus trap과 focus 복원
15. 스타일 분석과 다운로드 outcome 이벤트

### 회귀 임계값

- 시나리오 중 고유 client width: 1개
- 활성 guide-root 최소 opacity: 1
- 링 최대 위치 오차: 1px
- 링 노출 후 최대 스크롤 변화: 0.5px
- 잠금 상태 변화: 시작 locked 1회, 종료 unlocked 1회
- 모바일 대상과 패널 안전 거리: 최소 24px
- 실제 제품 모드 재방문 자동 가이드: 0개
- 프로토타입 반복 테스트 재방문 자동 가이드: 1개

### 기존 검증 자산

- 현재 정적 프로토타입은 데스크톱, 모바일, 동작 줄이기 Chromium 환경에서 가이드 흐름을 검증했다.
- 보고서 QA는 브라우저 geometry 측정과 JavaScript 문법 검사, diff 공백 검사를 함께 사용한다.
- 카피나 동작을 바꾼 뒤 보고서 명세와 미러 기획 문서의 가이드 블록이 동일한지 비교한다.

## Out of Scope

- 포함, 제외, 스타일 분석, 다운로드 기능 자체의 재설계
- 어떤 제안을 포함 또는 제외할지 변경하는 규칙
- 업로드한 원고 원본 수정
- 가이드 중 스타일 분석 또는 다운로드 자동 실행
- 가이드 중 실제 보고서 컨트롤 조작 허용
- 전체 도움말 센터 또는 영상 튜토리얼 구축
- 업로드, 분석 진행, 라이브러리, 결제, 설정 화면 온보딩
- 현재 한국어 카피 외 다국어 지원
- 기준선 데이터 없이 수치 성공 목표 확정
- 다른 카피나 단계 순서를 비교하는 실험
- 프로젝트와 라벨 설정이 없는 외부 이슈 트래커 게시

## Further Notes

### 출시 순서

1. 제품·디자인·QA가 정적 프로토타입을 검토하는 동안 반복 테스트 모드를 유지한다.
2. 카피, 대상 위치, 키보드 동작, 모바일 배치, 회귀 임계값을 확정한다.
3. 계정 단위 저장과 측정 어댑터를 실제 제품에 연결한다.
4. 반복 테스트 모드를 끈다.
5. 실제 제품의 사용자·버전별 최초 1회 노출을 검증한다.
6. 생명주기와 outcome 이벤트를 활성화해 출시한다.
7. 기준 지표를 확보한 뒤 정량 목표나 카피 실험을 설정한다.

### 카피 가드레일

사용:

- **다운로드할 보고서에 반영**
- **원고 원본은 변경되지 않습니다**
- **editorial이 어떤 기준과 근거로 교정 작업을 했는지**

금지:

- **원고에 적용**
- **수정 완료**
- **자동 반영**
- 원고 원본이 즉시 바뀌는 것으로 해석될 수 있는 표현
- editorial이 편집자의 판단을 대신한다는 표현

### 기준 문서 정책

- 이 PRD를 보고서 온보딩 기능의 제품 요구사항 기준으로 삼는다.
- 실제 보고서, 공통 상호작용 모듈, 보고서 명세, 미러 기획 문서는 이 PRD와 일치해야 한다.
- 카피 또는 동작 변경 시 runtime과 두 명세 표면을 같은 변경에서 함께 갱신한다.
- 정적 프로토타입의 always-show 플래그는 임시 QA 결정이며 실제 제품 노출 정책이 아니다.
