fix(art): give both 2026-10-20 posts their artwork, and gate the build on it
Deploy / build (push) Successful in 34s

The YuE2 and subtitles posts shipped text-only: render_from_art.mjs only READS
ogImage/banner, and after the 2026-10-19 bulk migration no script had to write
them, so both pages advertised /og-default.jpg and rendered no hero banner.

- new metaphors (in build_captions.py, frozen here via sync_prompts_catalog.py),
  captions, art-meta evidence, banner plan and the five derived files per slug
- frontmatter: ogImage + banner in EN and ZH for both posts
- scripts/check-assets.mjs is now step 1 of npm run build, so CI fails when a
  published post lacks a language-correct og card, banner, banner .webp or
  400/800 list thumb. It reported 16 problems on the unfixed tree, all here.
This commit is contained in:
hoelee committed 2026-10-20 23:37:52 +08:00
1 parent 557f312bc7
commit 0dae8b0daa
26 files changed
+229 -2

No files matched your search

+6
View File
@@ -43,6 +43,12 @@ Read this **before** touching theme, layout, typography, color, or SEO markup. P
| Real photos (author, hardware) | **WebP q82** + JPEG fallback | Continuous-tone images are the opposite case from the flat art above. |
Regenerate all derivatives after adding a post: `uv run --with pillow python scripts/optimize-images.py`.
- **Every published post must point at its own art.** `scripts/check-assets.mjs` runs as the first
step of `npm run build` (so CI fails, not just warns) and rejects a post whose `ogImage` or
`banner` is missing or misnamed, or whose banner `.webp` / `-400` / `-800` thumbs are absent.
The renderers only *read* frontmatter — nothing writes these two fields for a new post, which is
how two 2026-10-20 posts shipped on `/og-default.jpg` with no hero banner.
- **Declare `og:image:width/height` explicitly** — mis-declared dimensions get preview cards rejected by WhatsApp/Telegram/LinkedIn.
- **Favicon**: reference all sizes (`.ico` + 32×32 + 192×192 PNG + apple-touch 180×180). "Favicon not showing" is usually browser cache, not a missing asset — `curl` the live files before "fixing".