ARCHIVE
아카이브
기존에 공개한 글을 원래 주소 그대로 보관합니다.
과거의 글에는 작성 당시의 기술과 관점이 담겨 있습니다.
356개 글 · 2 / 12 페이지
· EN
What a 26-page WCAG-EM sample missed in a 1,342-page build
W3C shipped WCAG-EM 2.0 in July 2026. I sampled 26 pages by its procedure, then swept the whole 1,342-page build. The sample caught one of four defect types.
· EN
I Authored Six of the Seven Places My Title Is Declared
Six title channels agreed across 1,296 pages. The seventh, inbound anchor text, matched the target heading on 0.7% of 18,296 links. One wrapper caused it.
· EN
24,948 of My 46,382 Internal Links Pointed at a 301
Across 1,334 pages, 24,948 of 46,382 internal links pointed at a slash-less URL that 301-redirects. The root cause, a four-stage fix, and the audit that hit zero.
· EN
I removed the archive pages and 296 posts became unreachable
A breadth-first crawl of 1,330 built pages put 1,276 posts at depth 2. Dropping the four flat archives left 296 of them unreachable from the homepage.
· EN
What a div grid loses: a11y tree vs. text extraction
I built one opening-hours table four ways, then ran axe-core and five extractors over it. axe passed all four, yet three lost all 7 rows once HTML became text.
· EN
Why Prerendered LCP Reads 6.2s Without activationStart
Speculation Rules prerendering folds the whole pre-click wait into raw LCP. I measured a 6244ms vs 103.5ms gap on Chrome 150 and mapped where RUM needs fixing.
· EN
Why I Re-Run My Injection Tests Every Time I Bump the Model
I ran a prompt-injection regression suite on my LLM pipeline. A naive guard caught 2 of 11, a structural guard caught all 11, and it flagged my own regression.
· EN
WebMCP's Origin Trial: provideContext Is Already Gone
WebMCP shipped as a Chrome 149 origin trial, but its API already moved: navigator.modelContext is now document.modelContext and provideContext is gone.
· EN
FAQ Rich Results Are Dead. Don't Delete the Q&A Markup
Google retired FAQ rich results on May 7, 2026. FAQPage JSON-LD still passes the schema validator but returns DEPRECATED. What to change in code and content.
· EN
WebSockets and bfcache: Chrome 150 Still Said 'websocket'
Chrome 149 said active WebSockets no longer block bfcache. I re-measured on three Chrome 150 builds and notRestoredReasons still returned 'websocket'. Why?
· EN
aria-modal="true" Blocked Nothing: Focus Escape Measured
Keyboard focus escaped an aria-modal dialog on the third Tab press while axe reported zero violations. I measured the same markup under aria-hidden and inert.
· EN
Restaurant JSON-LD: Nobody Catches opens: "eleven"
I added Restaurant structured data to my restaurant-discovery PWA, then fed the same three defects to three validation layers to measure which one catches what.
· EN
One listener costs you the back button: six bfcache probes
Six pages, one bfcache blocker each, measured on real back navigations with pageshow.persisted and notRestoredReasons. Only unload blocked the restore.
· EN
1,248 Feed Items, Four Languages, Zero Language Metadata
W3C published a first draft on language and direction metadata for strings. I audited my four-language blog against it, measured where dir=auto guesses wrong, and shipped a build gate.
· EN
WCAG 2.2 Target Size: the AA Failure Behind a Green 92
22×22 pagination links your thumb keeps missing still scored 92 on Lighthouse. I measured WCAG 2.2 SC 2.5.8 (24×24) two ways and coded the spacing exception.
· EN
The meta Line That Decides If AI Overviews Can Quote You
A stray nosnippet no longer hides your snippet only. Google says it blocks the page as AI Overview input. I built broken and fixed pages and a parser to audit.
· EN
content-visibility Measured: One CSS Line, 15x Less Layout
Same HTML, same bytes, one CSS line, and forced layout dropped from 27.3ms to 1.8ms. I traced content-visibility: auto in Chrome and mapped its a11y traps.
· EN
Measuring INP: one click cost 264ms, chunking it got 56ms
INP replaced FID in Core Web Vitals in 2024. I ran 220ms of work as one blocking task versus sliced with scheduler.yield: 264ms fell to 56ms, in code and logs.
· EN
Cutting CLS from 0.559 to 0.014, measured
I built the same page two ways and measured both. Reserved image boxes and pre-placed slots dropped Cumulative Layout Shift from 0.559 (POOR) to 0.014 (GOOD).
· EN
A 117KB hero with a 1.2s LCP: the browser found it too late
Slow LCP is rarely about image weight — it is about when the browser finds it. I traced a CSS hero invisible to the preload scanner and cut LCP 1247ms to 109ms.
· EN
Catch Broken JSON-LD in CI Before It Ships
A JSON-LD parser passes markup no search engine can read: schema.org sets @vocab, so typos and wrong casing expand into valid JSON-LD. A 60-line schema-aware validator catches them in CI, with real logs.
· EN
What axe-core Misses After Reporting Zero Violations
I seeded eight WCAG barriers into a checkout page and ran axe-core. It caught the four rule-based ones and missed the four needing human judgment entirely.
· EN
JSON-LD vs Microdata vs RDFa: Which Structured Data Syntax, and Why
The same Product entity in three syntaxes, bytes and fragility measured. Google treats them equally, so the reason to choose JSON-LD is coupling, not ranking.
· EN
A wrong accessible name breaks voice control and AI agents
aria-label can make the accessibility tree announce a word no one sees. A reproduced WCAG 2.5.3 Label in Name failure, with Agentic Browsing going 0 to 100.
· EN
AI Crawlers Don't Run Your JavaScript
GPTBot and ClaudeBot don't render JS. Here's a curl experiment proving client-side pages are invisible to AI search, plus how to fix it server-side.
· EN
In sitemap.xml, lastmod Is the Only Field Google Actually Reads
Ship priority 1.0 with changefreq always and Google drops both. The only field it uses is lastmod, and only when verifiably accurate. I ran three sitemaps through the official XSD to see what really counts.
· EN
Why color-contrast Disappears When You Put axe-core in CI
axe-core in jsdom catches structural a11y violations without a browser, but color-contrast comes back incomplete, not pass. Why it happens, and how to split CI into two tiers.
· EN
5-Day Technical SEO Audit: Gates Mattered More Than Fixes
A 5-day audit of my 4-language blog: 12 broken links, 4 hreflang pairs, 405KB blocking CSS, 21 drifted translations, all fixed and locked in with build gates.
· EN
Tie Your JSON-LD Into One @graph Search and AI Can Read
My JSON-LD validated as three disconnected islands. Here's how @id references stitch Organization, WebSite, and Article into one @graph, measured with jsonld.
· EN
hreflang Must Be Bidirectional: My 4-Language Blog Audit
I aimed a 30-line checker at my build output: 248 posts passed their hreflang clusters, the homepage failed. Google's reciprocity rules, run logs, and the fix.