first commit

This commit is contained in:
2026-10-06 12:16:46 +09:00
commit 619d980098
415 changed files with 22283 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

@@ -0,0 +1,117 @@
{
"recordedAt": "2026-09-22T22:38:36.729Z",
"finalBrowser": {
"controls": [
{
"id": "image",
"value": ""
},
{
"id": "test-photo",
"value": "dog1"
},
{
"id": "grid-size",
"value": "13"
},
{
"id": "curvature",
"value": "1"
},
{
"id": "gloss-strength",
"value": "0.3"
},
{
"id": "camera-offset",
"value": "0.5"
},
{
"id": "photo-zoom",
"value": "1"
},
{
"id": "photo-pan-x",
"value": "0"
},
{
"id": "photo-pan-y",
"value": "0"
},
{
"id": "video",
"value": ""
},
{
"id": "depth-image",
"value": ""
},
{
"id": "view-mode",
"value": "final"
},
{
"id": "effect",
"value": "mosaic"
},
{
"id": "mosaic-style",
"value": "0"
},
{
"id": "depth-scale",
"value": "0.25"
},
{
"id": "light-x",
"value": "0.6"
},
{
"id": "light-y",
"value": "0.8"
},
{
"id": "sensitivity",
"value": "1"
}
],
"height": 720,
"width": 1280
},
"aiStatus": "자동 AI 추정 depth를 적용했습니다.",
"depthProvenance": "AI 추정 · Depth Anything V2 Small (상대 깊이, 0=뒤 · 1=앞)",
"viewportOverrideReset": true,
"consoleAudit": {
"levels": [
"error",
"warn"
],
"limit": 100,
"entries": []
},
"mobileRetest": {
"photo": "dog1",
"viewportWidth": 390,
"viewportHeight": 844,
"devicePixelRatio": 1,
"visualViewportScale": 1,
"scrollX": 0,
"scrollY": 0,
"documentScrollWidth": 375,
"canvas": {
"x": 0,
"y": 200,
"width": 375,
"height": 506.390625,
"bottom": 706.390625
},
"aside": {
"x": 0,
"y": 706.390625,
"width": 375,
"height": 966,
"bottom": 1672.390625
},
"screenshot": "dog1-mobile-retest-viewport.png"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

@@ -0,0 +1,114 @@
Browser tab: 1, Title: "Pet Behind Glass", URL: "http://127.0.0.1:5174/".
1 AXWebArea Pet Behind Glass, URL: 127.0.0.1:5174/
2 container
3 container Description: 레퍼런스 비교 이미지, ID: reference-strip
4 container Ref1 · 주 기준
5 text Ref1 · 주 기준
6 container Ref2 · 보조
7 text Ref2 · 보조
9 text 화면을 드래그해서 시점을 움직여보세요
10 heading Pet Behind Glass, Value: 1
11 text Pet Behind Glass
12 container
13 text 사진 선택
14 button 사진 선택, ID: image
15 button AI 깊이 생성, ID: ai-depth
130 text AI 추정 · Depth Anything V2 Small (상대 깊이, 0=뒤 · 1=앞)
16 container
17 text 테스트 사진
18 pop up button (collapsed, settable) 테스트 사진, Value: 멍멍이 4 · 벤치 위 갈색 닥스훈트, ID: test-photo, Secondary Actions: Expand
19 menu
20 기존 샘플 · 흰 강아지 얼굴
21 멍멍이 1 · 잔디 위 흰 포메라니안
22 멍멍이 2 · 실내에 엎드린 검정·갈색 강아지
23 멍멍이 3 · 후드 옷을 입은 강아지 두 마리
24 (selected) 멍멍이 4 · 벤치 위 갈색 닥스훈트
25 button 선택한 테스트 사진 불러오기, ID: sample
26 text Ref1 기준 · 색면 단순화 1 · 굴절 1 (고정)
27 container
28 text Grid Size
29 container Grid Size 13, ID: gridOut
105 text 13
31 slider (settable, integer) Value: 13, ID: grid-size
32 text 큰 얼굴 12–16 · 작은 얼굴/여러 마리 20–24
33 container gloss-controls
34 container
35 text 셀 굴곡 (−1 오목 · +1 볼록)
36 container 셀 굴곡 (−1 오목 · +1 볼록) 1, ID: curvatureOut
37 text 1.00
38 slider (settable, integer) Value: 1, ID: curvature
39 text |굴곡| 0.65–1 권장
40 container
41 text 광택 강도
42 container 광택 강도 0.3, ID: glossOut
43 text 0.30
44 slider (settable, float) Value: 0.30000001192092896, Details: 0.3, ID: gloss-strength
45 container
46 text Camera Offset
47 container Camera Offset 0.5, ID: cameraOut
48 text 0.50
49 slider (settable, float) Value: 0.5, ID: camera-offset
50 text 권장 0.35–0.65 · 시점 이동 범위
51 button 시점 초기화, ID: reset
52 button Gyroscope: OFF, ID: gyro
106 container
107 button (expanded) 사진 구도, Secondary Actions: Collapse
108 text 사진 구도
109 text 사진 확대
110 container 사진 확대 1.5, ID: photoZoomOut
127 text 1.50
112 slider (settable, float) Value: 1.5, ID: photo-zoom
113 text 사진 가로 위치
114 container 사진 가로 위치 0.1, ID: photoPanXOut
128 text 0.10
116 slider (settable, float) Value: 0.10000000149011612, Details: 0.1, ID: photo-pan-x
117 text 사진 세로 위치
118 container 사진 세로 위치 -0.1, ID: photoPanYOut
129 text -0.10
120 slider (settable, float) Value: -0.10000000149011612, Details: -0.1, ID: photo-pan-y
121 button 사진 구도 초기화, ID: photo-reset
59 container
60 button (expanded) 개발 비교, Secondary Actions: Collapse
61 text 개발 비교
62 text 동영상 선택
63 button 동영상 선택, ID: video
64 text Depth 이미지 선택
65 button Depth 이미지 선택, ID: depth-image
66 text View Mode
67 pop up button (collapsed, settable) View Mode, Value: Final, ID: view-mode, Secondary Actions: Expand
68 menu
69 (selected) Final
70 No Glass
71 RGB
72 Depth
73 Glass Only
74 text Glass
75 pop up button (collapsed, settable) Glass, Value: Mosaic, ID: effect, Secondary Actions: Expand
76 menu
77 (selected) Mosaic
78 Reeded
79 Frosted
80 text Mosaic 스타일
81 pop up button (collapsed, settable) Mosaic 스타일, Value: 조각 유리, ID: mosaic-style, Secondary Actions: Expand
82 menu
83 (selected) 조각 유리
84 촘촘 유리
85 text Depth Scale
86 container Depth Scale 0.25, ID: depthOut
87 text 0.25
88 slider (settable, float) Value: 0.25, ID: depth-scale
89 text 조명 가로
90 container 조명 가로 0.6, ID: lightXOut
91 text 0.60
92 slider (settable, float) Value: 0.6000000238418579, Details: 0.6, ID: light-x
93 text 조명 세로
94 container 조명 세로 0.8, ID: lightYOut
95 text 0.80
96 slider (settable, float) Value: 0.800000011920929, Details: 0.8, ID: light-y
97 text View sensitivity
98 container View sensitivity 1, ID: sensitivityOut
99 text 1.00
100 slider (settable, integer) Value: 1, ID: sensitivity
131 text AI 추정 depth를 적용하고 Final 뷰로 돌아왔습니다.
The focused UI element is 1 AXWebArea Pet Behind Glass, URL: 127.0.0.1:5174/
@@ -0,0 +1,15 @@
Browser tab: 1, Title: "Pet Behind Glass", URL: "http://127.0.0.1:5174/".
The following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.
Removed element IDs: 123-125, 127
~ 15 button (disabled) AI 깊이 생성 중…, ID: ai-depth
~ 110 container 사진 확대 1.5, ID: photoZoomOut
+ 127 text 1.50
~ 112 slider (settable, float) Value: 1.5, ID: photo-zoom
~ 114 container 사진 가로 위치 0.1, ID: photoPanXOut
+ 128 text 0.10
~ 116 slider (settable, float) Value: 0.10000000149011612, Details: 0.1, ID: photo-pan-x
~ 118 container 사진 세로 위치 -0.1, ID: photoPanYOut
+ 129 text -0.10
~ 120 slider (settable, float) Value: -0.10000000149011612, Details: -0.1, ID: photo-pan-y
+ 130 text AI 깊이를 계산하는 중입니다…
The focused UI element is 1 AXWebArea Pet Behind Glass, URL: 127.0.0.1:5174/
Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

@@ -0,0 +1,114 @@
Browser tab: 1, Title: "Pet Behind Glass", URL: "http://127.0.0.1:5174/".
1 AXWebArea Pet Behind Glass, URL: 127.0.0.1:5174/
2 container
3 container Description: 레퍼런스 비교 이미지, ID: reference-strip
4 container Ref1 · 주 기준
5 text Ref1 · 주 기준
6 container Ref2 · 보조
7 text Ref2 · 보조
9 text 화면을 드래그해서 시점을 움직여보세요
10 heading Pet Behind Glass, Value: 1
11 text Pet Behind Glass
12 container
13 text 사진 선택
14 button 사진 선택, ID: image
15 button AI 깊이 생성, ID: ai-depth
103 text AI 추정 · Depth Anything V2 Small (상대 깊이, 0=뒤 · 1=앞)
16 container
17 text 테스트 사진
18 pop up button (collapsed, settable) 테스트 사진, Value: 멍멍이 4 · 벤치 위 갈색 닥스훈트, ID: test-photo, Secondary Actions: Expand
19 menu
20 기존 샘플 · 흰 강아지 얼굴
21 멍멍이 1 · 잔디 위 흰 포메라니안
22 멍멍이 2 · 실내에 엎드린 검정·갈색 강아지
23 멍멍이 3 · 후드 옷을 입은 강아지 두 마리
24 (selected) 멍멍이 4 · 벤치 위 갈색 닥스훈트
25 button 선택한 테스트 사진 불러오기, ID: sample
26 text Ref1 기준 · 색면 단순화 1 · 굴절 1 (고정)
27 container
28 text Grid Size
29 container Grid Size 13, ID: gridOut
105 text 13
31 slider (settable, integer) Value: 13, ID: grid-size
32 text 큰 얼굴 12–16 · 작은 얼굴/여러 마리 20–24
33 container gloss-controls
34 container
35 text 셀 굴곡 (−1 오목 · +1 볼록)
36 container 셀 굴곡 (−1 오목 · +1 볼록) 1, ID: curvatureOut
37 text 1.00
38 slider (settable, integer) Value: 1, ID: curvature
39 text |굴곡| 0.65–1 권장
40 container
41 text 광택 강도
42 container 광택 강도 0.3, ID: glossOut
43 text 0.30
44 slider (settable, float) Value: 0.30000001192092896, Details: 0.3, ID: gloss-strength
45 container
46 text Camera Offset
47 container Camera Offset 0.5, ID: cameraOut
48 text 0.50
49 slider (settable, float) Value: 0.5, ID: camera-offset
50 text 권장 0.35–0.65 · 시점 이동 범위
51 button 시점 초기화, ID: reset
52 button Gyroscope: OFF, ID: gyro
106 container
107 button (expanded) 사진 구도, Secondary Actions: Collapse
108 text 사진 구도
109 text 사진 확대
110 container 사진 확대 1.5, ID: photoZoomOut
111 text 1.50
112 slider (settable, float) Value: 1.5, ID: photo-zoom
113 text 사진 가로 위치
114 container 사진 가로 위치 0.1, ID: photoPanXOut
115 text 0.10
116 slider (settable, float) Value: 0.10000000149011612, Details: 0.1, ID: photo-pan-x
117 text 사진 세로 위치
118 container 사진 세로 위치 -0.1, ID: photoPanYOut
119 text -0.10
120 slider (settable, float) Value: -0.10000000149011612, Details: -0.1, ID: photo-pan-y
121 button 사진 구도 초기화, ID: photo-reset
59 container
60 button (expanded) 개발 비교, Secondary Actions: Collapse
61 text 개발 비교
62 text 동영상 선택
63 button 동영상 선택, ID: video
64 text Depth 이미지 선택
65 button Depth 이미지 선택, ID: depth-image
66 text View Mode
67 pop up button (collapsed, settable) View Mode, Value: Final, ID: view-mode, Secondary Actions: Expand
68 menu
69 (selected) Final
70 No Glass
71 RGB
72 Depth
73 Glass Only
74 text Glass
75 pop up button (collapsed, settable) Glass, Value: Mosaic, ID: effect, Secondary Actions: Expand
76 menu
77 (selected) Mosaic
78 Reeded
79 Frosted
80 text Mosaic 스타일
81 pop up button (collapsed, settable) Mosaic 스타일, Value: 조각 유리, ID: mosaic-style, Secondary Actions: Expand
82 menu
83 (selected) 조각 유리
84 촘촘 유리
85 text Depth Scale
86 container Depth Scale 0.25, ID: depthOut
87 text 0.25
88 slider (settable, float) Value: 0.25, ID: depth-scale
89 text 조명 가로
90 container 조명 가로 0.6, ID: lightXOut
91 text 0.60
92 slider (settable, float) Value: 0.6000000238418579, Details: 0.6, ID: light-x
93 text 조명 세로
94 container 조명 세로 0.8, ID: lightYOut
95 text 0.80
96 slider (settable, float) Value: 0.800000011920929, Details: 0.8, ID: light-y
97 text View sensitivity
98 container View sensitivity 1, ID: sensitivityOut
99 text 1.00
100 slider (settable, integer) Value: 1, ID: sensitivity
104 text 자동 AI 추정 depth를 적용했습니다.
The focused UI element is 120 slider (settable, float) Value: -0.10000000149011612, Details: -0.1, ID: photo-pan-y
@@ -0,0 +1,7 @@
Browser tab: 1, Title: "Pet Behind Glass", URL: "http://127.0.0.1:5174/".
The following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.
Removed element IDs: 122
~ 15 button AI 깊이 생성, ID: ai-depth
+ 126 text AI 추정 · Depth Anything V2 Small (상대 깊이, 0=뒤 · 1=앞)
+ 127 text 자동 AI 추정 depth를 적용했습니다.
The focused UI element is 25 button 선택한 테스트 사진 불러오기, ID: sample
@@ -0,0 +1,16 @@
Browser tab: 1, Title: "Pet Behind Glass", URL: "http://127.0.0.1:5174/".
The following is a diff from the previous accessibility tree with ~ and + representing changed and added elements, respectively. Removed elements are summarized by ID range.
Removed element IDs: 103-104, 111, 115, 119
~ 15 button (disabled) AI 깊이 생성 중…, ID: ai-depth
+ 122 text Depth 없음 · 평면 사진 테스트
~ 110 container 사진 확대 1, ID: photoZoomOut
+ 123 text 1.00
~ 112 slider (settable, integer) Value: 1, ID: photo-zoom
~ 114 container 사진 가로 위치 0, ID: photoPanXOut
+ 124 text 0.00
~ 116 slider (settable, integer) Value: 0, ID: photo-pan-x
~ 118 container 사진 세로 위치 0, ID: photoPanYOut
+ 125 text 0.00
~ 120 slider (settable, integer) Value: 0, ID: photo-pan-y
+ 126 text AI 모델 다운로드 중 · 100%
The focused UI element is 25 button 선택한 테스트 사진 불러오기, ID: sample
+123
View File
@@ -0,0 +1,123 @@
# 다양한 강아지 사진 QA 결과 — 2026-09-23
기존 샘플 1장과 강아지 사진 4장으로 로컬 브라우저 QA를 진행했다. 강아지 사진 4장의 자동 AI 깊이 생성과 화면 출력을 확인했으며, **같은 사진을 다시 불러오면 수동 구도가 초기화되는 결함**을 재현했다. 어두운 얼굴과 작은 얼굴은 기본 Grid13에서 눈·코 식별성이 크게 낮아졌다. 두 마리 사진과 닥스훈트 사진은 Grid24에서 세부 구조가 더 남았지만, Ref1의 유리 표현을 충족했다고 판정하지는 않았다.
이번 작업의 산출물은 QA 기록·스크린샷·진단 JSON이다. 소스 코드, 셰이더, 스타일, 빌드 설정과 테스트 코드는 수정하지 않았다.
## 1. 검증 조건과 범위
| 항목 | 조건 |
| --- | --- |
| 실행 주소 | `http://127.0.0.1:5174/` |
| 주 시각 기준 | Ref1. Ref2는 보조 비교 자료 |
| 기본 효과 | Final / Mosaic / 조각 유리 |
| 기본값 | Grid13, 굴곡 +1, 광택 0.30, Camera Offset 0.50, Depth Scale 0.25 |
| 사진 구도 | 확대 1.00, 가로 0.00, 세로 0.00. 구도 재현 실험에서만 수동 변경 |
| 고정값 | 색면 단순화 1, 굴절 1 |
| 깊이 출처 | 기존 샘플: 수작업·절차적 근사. dog1–4: Depth Anything V2 Small AI 추정 |
| 모바일 확인 | 브라우저 뷰포트 390×844, DPR 1. 실제 휴대폰 검증은 아님 |
AI 성공 문구와 깊이 출처 표시를 함께 확인했다. AI 완료 시 Final로 전환되므로 No Glass 비교는 추론 완료 후 선택했다. 사진 전환은 카메라를 초기화하지 않으므로 중앙 비교에는 시점 초기화를 사용했다. No Glass도 깊이로 변형된 사진 표면이며, 변형 없는 원본 RGB와 동일하다고 해석하지 않는다.
## 2. 사진별 결과
| 사진 | 기능 검증 | 시각 관찰 및 증거 |
| --- | --- | --- |
| 기존 샘플 | 수작업 깊이 출처, No Glass 중앙/드래그, Final Grid13 | [Grid13](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/sample-grid13.png). 초기 No Glass 캡처의 크롭은 아래 증거 제한 참고 |
| dog1 · 잔디 위 흰 포메라니안 | 자동 AI 성공, No Glass, Final Grid13, 모바일 재검증 성공 | 흰 몸과 어두운 눈·코가 비교적 구분된다. [No Glass](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog1-noglass.png) · [Grid13](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog1-grid13.png) |
| dog2 · 실내의 검정·갈색 강아지 | 자동 AI 성공, No Glass 중앙/드래그, Final Grid13 | 실루엣은 남지만 어두운 얼굴의 눈·코가 큰 색면에 섞인다. [No Glass](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog2-noglass.png) · [Grid13](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog2-grid13.png) |
| dog3 · 후드 옷을 입은 두 마리 | 서버 복구 후 자동 AI 성공, No Glass, Grid13/24, Grid24 드래그 | Grid13에서 작은 얼굴 정보가 대부분 사라진다. Grid24는 얼굴·옷·배경 구조를 더 남기지만 블록화 인상이 강하다. [No Glass](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog3-noglass.png) · [드래그](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog3-grid24-drag.png) |
| dog4 · 벤치 위 갈색 닥스훈트 | 자동 AI와 수동 AI 재생성 성공, No Glass, Grid13/24, 모바일 확인, 구도 대조 실험 | Grid13에서 갈색·어두운 얼굴 정보가 합쳐진다. Grid24는 구조를 더 남기며, 머리·오른쪽의 창문 모양 반사가 두드러진다. [No Glass](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog4-noglass.png) · [Grid13](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog4-grid13.png) · [Grid24](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog4-grid24.png) |
두 마리 사진의 같은 구도 비교:
| Grid13 | Grid24 |
| --- | --- |
| ![두 마리 강아지 Grid13](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog3-grid13.png) | ![두 마리 강아지 Grid24](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog3-grid24.png) |
이 평가는 저장된 출력의 시각 관찰이다. 출력이 블록처럼 보인다는 사실만으로 셰이더가 단순 저해상도 확대를 사용한다고 결론 내리지는 않는다. Grid24의 개선도 Ref1 재현 완료나 눈·코 식별성의 일반적인 보장을 뜻하지 않는다.
## 3. 재현된 결함: 같은 사진 재불러오기 시 구도 초기화
**우선 수정 대상.** 자동 구도 변경 금지 요구사항과 충돌하며, 사용자가 맞춘 확대·팬을 잃는다.
1. dog4를 불러오고 AI 생성 완료를 확인한다.
2. 사진 구도를 확대 **1.50**, 가로 **+0.10**, 세로 **−0.10**으로 설정한다.
3. 선택 사진을 바꾸지 않고 **선택한 테스트 사진 불러오기**를 누른다.
4. AI 생성이 진행 중인 시점에 이미 **1.00 / 0.00 / 0.00**으로 초기화된다. AI 완료 후에도 초기값이 유지된다.
대조 실험에서는 같은 수동 구도에서 사진을 다시 불러오지 않고 **AI 깊이 생성**만 실행했다. 이때는 생성 중과 성공 후 모두 **1.50 / +0.10 / −0.10**이 유지됐다. 따라서 재현된 원인은 사진 로드 경로의 구도 초기화이며, AI 완료 단계가 구도 값을 초기화하는 것으로 보고하지 않는다.
| 조건 | 실행 전 | 실행 중 | 완료 후 |
| --- | --- | --- | --- |
| 같은 사진 재불러오기 | 1.50 / +0.10 / −0.10 | 1.00 / 0.00 / 0.00 | 1.00 / 0.00 / 0.00 |
| 사진 재불러오기 없이 AI 재생성 | 1.50 / +0.10 / −0.10 | 1.50 / +0.10 / −0.10 | 1.50 / +0.10 / −0.10 |
실제 코드의 [src/main.ts:210](D:/project/behind_glass/src/main.ts:210)에서 `applyMedia()`가 `photoZoom = 1; photoPanX = 0; photoPanY = 0;`을 수행한다. 이 공통 경로는 다른 미디어 로드에도 적용될 가능성을 보여주지만, 브라우저에서 직접 재현한 범위는 **같은 테스트 사진 재불러오기**다.
증거: [변경 전](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-before-reload.txt), [재불러오기 직후](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-reload-immediate.txt), [재불러오기 완료](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-reload-completed.txt), [AI만 재생성 중](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-ai-regenerate-start.txt), [AI만 재생성 완료](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-ai-regenerate-completed.txt).
| 사진 재불러오기 전 | 사진 재불러오기 후 |
| --- | --- |
| ![수동 구도 설정](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-before-reload.png) | ![재불러오기 후 구도 초기화](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/framing-after-reload.png) |
수정 후에는 같은 사진 재불러오기, 다른 사진 입력, AI만 재생성, 명시적인 사진 구도 초기화 버튼을 구분해 검증해야 한다. 이번 QA에서는 수정하지 않았다.
## 4. 모바일 재검증과 최종 콘솔
초기 `dog1-mobile-grid13.png`에는 앱이 왼쪽에 작게 나타나는 이상 캡처가 있었다. 이후 dog4와 dog1을 390×844에서 다시 확인했을 때는 정상 크기의 세로 배치가 나타났으며, **이전 축소 현상은 재현되지 않았다**. 초기 캡처의 원인을 확정하거나 모바일 전체가 정상이라고 판정하지 않는다.
dog1을 새로 불러와 자동 AI 성공을 확인한 뒤 측정한 값:
| 측정값 | 결과 |
| --- | --- |
| `innerWidth × innerHeight` | 390 × 844 |
| DPR / `visualViewport.scale` | 1 / 1 |
| `scrollX / scrollY` | 0 / 0 |
| 문서 `scrollWidth` | 375 — 측정 시 가로 넘침 없음 |
| Canvas | x=0, y=200, 폭 375, 높이 506.390625 |
| 조절 패널 `aside` | x=0, y=706.390625, 폭 375, 높이 966 |
![포메라니안 모바일 재검증](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog1-mobile-retest-viewport.png)
추가 증거: [닥스훈트 모바일 화면](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog4-mobile-viewport.png) · [닥스훈트 전체 페이지](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/dog4-mobile-fullpage.png).
최종 콘솔 조회는 `error`·`warn` 수준, 최대 100건 범위에서 **빈 배열 `[]`**이었다. 이는 해당 탭에서 도구에 수집된 로그의 조회 결과이며, 모든 과거 세션이나 실제 휴대폰의 오류가 없음을 증명하지 않는다.
임시 뷰포트 오버라이드를 `reset()`으로 해제했고, 이후 크기는 **1280×720**이었다. 최종 사진은 dog1이며, Final / Mosaic / 조각 유리, Grid13, 굴곡 +1, 광택 0.30, Camera Offset 0.50, Depth Scale 0.25, 확대·팬 1/0/0을 DOM 값으로 확인했다. 상태는 `자동 AI 추정 depth를 적용했습니다.`였다. 측정값·최종 설정·콘솔 결과는 [final-diagnostics.json](D:/project/behind_glass/docs/qa-varied-dogs-2026-09-23/final-diagnostics.json)에 저장했다.
## 5. 기존 검사 결과와 테스트 유지보수 사항
다음은 **앞선 QA 단계에서 기록한 종료 코드 0 결과**다. 이번 마무리 단계에서는 소스 변경이 없어 재실행하지 않았다.
```text
npm.cmd run build
node scripts/test-camera-history.mjs
node scripts/test-mosaic-continuity.mjs
node scripts/test-mosaic-depth-distance.mjs
node scripts/test-region-atlas-dark-sampling.mjs
node scripts/test-region-axis-split.mjs
node scripts/test-surface-reflection.mjs
node scripts/test-window-reveal-coverage.mjs
```
빌드 기록에는 500kB 초과 청크 경고가 있었다. 메인 JavaScript는 524.84kB, AI worker는 878.03kB였다. 이 수치만으로 로딩 시간이나 추론 성능을 판정하지 않는다.
**테스트 코드에서 확인한 유지보수 사항:**
- [test-region-axis-split.mjs:115](D:/project/behind_glass/scripts/test-region-axis-split.mjs:115)의 별도 JavaScript 모델은 안전한 어두운 palette 선택을 구현하며, [151행](D:/project/behind_glass/scripts/test-region-axis-split.mjs:151)은 안전한 색이 없으면 원본 RGB를 유지하는 동작을 검사한다. 최신 요구사항은 최종 픽셀의 원본 RGB 복원 분기를 제거하는 것이므로, 이 테스트 통과를 현행 셰이더의 눈·코 보호나 시각 품질 검증으로 사용할 수 없다.
- **실행하지 않은** [ai-depth-smoke.mjs:69](D:/project/behind_glass/scripts/ai-depth-smoke.mjs:69)는 AI 완료 후 캡처를 `no-glass.png`로 저장한다. 관찰된 앱은 AI 완료 시 Final로 돌아가므로 파일명이 실제 모드를 보장하지 않는다. [105행](D:/project/behind_glass/scripts/ai-depth-smoke.mjs:105)은 사진 전환 후 AI 버튼 활성화·깊이 출처 숨김을 기대하는데, 현재 사진 입력은 자동 AI를 시작하고 성공 시 출처를 표시한다. 이 기대값도 현재 흐름에 맞춘 검토가 필요하다.
이 검사는 GPU 출력, 실제 AI 추론 성공, Ref1과의 시각적 유사성을 대신하지 않는다. `test-window-reveal-coverage`는 실제 클래스를 CPU raycasting으로 검사하지만 화면 렌더링 검사는 아니다.
## 6. 증거의 한계와 남은 검증
기존 수작업 샘플의 드래그 실험 기록에서는 카메라 X가 0.065일 때 코의 투영 X가 520.448→516.144, 왼쪽 눈은 493.625→490.020, 몸은 453.585→450.871로 이동했다. 이는 **수작업 샘플의 깊이별 투영 차이**를 지지한다. dog2의 No Glass 드래그와 dog3의 Final 드래그도 시각적 변화를 보였지만, AI가 추정한 코·눈 깊이의 정확도는 정량 측정하지 않았다.
초기 `sample-noglass-center.png`와 `sample-noglass-drag.png`는 stage 크롭을 사용했으나 출력에 레퍼런스 영역이 포함된 정황이 있어, 이 두 이미지의 크롭을 정밀 비교 근거로 사용하지 않는다. 이후 사진들은 일반 뷰포트 캡처를 사용했다.
dog3의 첫 로드 실패 시점에는 5174 포트의 개발 서버가 내려가 있었다. 서버를 다시 실행한 뒤 같은 사진의 로드와 AI 추론이 성공했다. **WebP 디코딩 결함으로 분류할 근거는 없다.**
실제 휴대폰 터치·자이로, 모바일 GPU와 FPS, 영상 플리커, 장시간 메모리·자원 해제, AI 중단/연속 입력의 모든 경합 상황, AI 깊이 정확도, 다른 유리 모드 전체 회귀는 이번 확인 범위에 포함되지 않는다. 샘플 사진과 QA 산출물을 외부에 게시하지 않았다.
현재 우선순위는 **사진 로드 시 수동 구도 보존 결함 수정**, 다음으로 **어두운 얼굴·작은 얼굴의 식별성과 Ref1 표현 재평가**, 그리고 **현행 동작과 어긋난 테스트 기대값 정리**다.
Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB