diff --git a/.jules/bolt.md b/.jules/bolt.md index c10fb9b..65f2457 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -12,3 +12,7 @@ ## 2026-07-10 - Remove unnecessary DOMPurify for performance **Learning:** 애플리케이션이 `textContent`와 같은 안전한 DOM API만 사용하고 `innerHTML` 등의 위험한 싱크를 사용하지 않는다면 DOMPurify와 같은 라이브러리를 통해 Trusted Types 정책을 생성할 필요가 없음. **Action:** 불필요한 번들 다운로드 및 스크립트 실행을 방지하기 위해 사용하지 않는 라이브러리를 식별하고 제거할 것. + +## 2026-08-05 - Separate image fetch and decode hints +**Learning:** The HTML Standard defines `decoding` as a preference hint whose missing-value default is `auto`; it does not guarantee a particular main-thread or background-thread execution path. `fetchpriority` independently influences fetch priority. Removing `decoding="async"` must therefore not be described as a guaranteed LCP improvement. +**Action:** Let eager first-viewport images use the user agent's `auto` decode strategy, retain `decoding="async"` for explicitly lazy images, and require non-vacuous tests for eager, lazy, and single high-priority LCP-candidate sets. Record the evidence and measurement limits in `docs/doctoring/image-rendering-hints.md`. diff --git a/CHANGELOG.md b/CHANGELOG.md index ca1847a..9bb1089 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG ## [Unreleased] +- **렌더링 힌트 정합성**: 첫 화면의 eager 이미지와 단일 LCP 후보에서 강제 `decoding="async"`를 제거해 HTML 표준의 기본 `auto` 판단에 맡기고, 지연 로드 이미지에는 비동기 디코딩 힌트를 유지했습니다. 정적 테스트가 eager, lazy, LCP 후보 집합의 존재와 조합을 검증하며, 실제 LCP 효과는 배포 후 실측 대상으로 유지합니다. - **UX/접근성 개선**: 프로젝트 카드의 클릭 영역을 카드 전체로 확장하여 사용자 편의성을 높였습니다. 태그를 확장하는 대신 가상 요소(pseudo-element) 겹침 방식을 사용하여 스크린 리더 접근성을 유지했습니다. - **보안 개선**: 컴포넌트 갤러리의 인라인 스크립트와 스타일을 외부 파일로 분리하고, 엄격한 Content-Security-Policy를 적용해 XSS 방어를 강화했습니다. - **성능 회귀 복원**: 오프스크린 `.section` 렌더링을 `content-visibility: auto`로 지연하고, 일반 섹션은 600px·콘텐츠가 큰 DIKW/projects 섹션은 1000px의 `contain-intrinsic-size` placeholder를 유지해 초기 렌더링 비용과 스크롤바 이동을 함께 줄였습니다. diff --git a/docs/doctoring/image-rendering-hints.md b/docs/doctoring/image-rendering-hints.md new file mode 100644 index 0000000..1bdf61b --- /dev/null +++ b/docs/doctoring/image-rendering-hints.md @@ -0,0 +1,26 @@ +# Image rendering hints + +## Decision + +The homepage separates image loading, fetch priority, and decode strategy instead of treating them as a single performance switch. + +- The single declared Largest Contentful Paint candidate remains eagerly discoverable and uses `fetchpriority="high"`. +- Eager first-viewport images omit the `decoding` attribute. The HTML Standard defines the missing value as the `auto` state, allowing the user agent to choose its decode behavior. +- Explicitly lazy-loaded, below-the-fold images retain `decoding="async"`. +- Automated tests prove that the eager, lazy, and high-priority image sets are non-empty before checking their contracts, preventing vacuous passes. + +## Rationale + +The `decoding` attribute is a preference hint, not a guarantee that a particular thread or rendering path will be used. Omitting it does not mean synchronous decoding; it selects the standards-defined `auto` state. Likewise, `fetchpriority` affects fetch priority and is independent from image decoding. Therefore this change does not claim a universal LCP improvement from removing `decoding="async"` alone. + +The contract is intentionally measurable: + +1. Static regression tests verify markup invariants. +2. Deployment performance should be evaluated separately with repeated field or laboratory measurements, including LCP distributions and representative device/network conditions. +3. Any future change to preload, lazy loading, or fetch priority must preserve a single explicit LCP candidate unless measurements justify a different strategy. + +## References + +Osmani, A., Sohoni, L., Meenan, P., & Pollard, B. (2023, November 14). *Optimize resource loading with the Fetch Priority API*. web.dev. https://web.dev/articles/fetch-priority + +WHATWG. (2026, July 20). *HTML living standard: The img element*. https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element diff --git a/index.html b/index.html index fd888db..a2dbbd7 100644 --- a/index.html +++ b/index.html @@ -29,7 +29,8 @@