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
@@ -221,5 +221,11 @@
},
"your-disk-full-alert-is-lying": {
"evidence": "3% free = 500 GB · alert fires wrong way"
},
"yue2-on-a-12gb-gpu-songs-that-lost-their-endings": {
"evidence": "12 takes - all 240.000 s - cap now 300 s"
},
"generating-subtitles-for-songs-without-timestamps": {
"evidence": "18 songs - 342 lines - 0.96 anchor coverage"
}
}
+48
View File
@@ -388,6 +388,30 @@
768
]
},
"generating-subtitles-for-songs-without-timestamps": {
"sw": 1877,
"sh": 1060,
"left": 545,
"top": 70,
"fill": [
11,
18,
25
],
"zoom": 1.38,
"silhouette": 0.47,
"cut": 0.0,
"band": [
743,
119,
1288,
635
],
"source_size": [
1360,
768
]
},
"hardening-a-tor-onion-service": {
"sw": 1952,
"sh": 1102,
@@ -1755,6 +1779,30 @@
1360,
768
]
},
"yue2-on-a-12gb-gpu-songs-that-lost-their-endings": {
"sw": 1887,
"sh": 1066,
"left": 556,
"top": 77,
"fill": [
10,
14,
22
],
"zoom": 1.387,
"silhouette": 0.47,
"cut": 0.0,
"band": [
747,
116,
1289,
643
],
"source_size": [
1360,
768
]
}
}
}
@@ -0,0 +1 @@
{"high_level_description":"A dark-mode 3D cyber-bento product render of a single piece of industrial hardware, photographed on a seamless dark backdrop. The main high-detail 3D focal subject is positioned on the right side of the canvas, leaving clean dark negative space across the left side.","style_description":{"aesthetics":"modern dark cyber-bento, industrial precision, sleek machined surfaces, raytraced ambient occlusion","lighting":"volumetric studio rim lighting in royal cobalt blue (#4d82ff) with electric cyan (#22d3ee) calibration light and soft ultraviolet spill and subtle cyan glow","medium":"3d_render","art_style":"octane render, matte obsidian hardware, frosted acrylic glass, precise machined surface detail","color_palette":["#0B0F19","#111827","#1E293B","#22D3EE","#7C5CFF","#4D82FF"]},"compositional_deconstruction":{"background":"Deep midnight obsidian slate background (#0b0f19 to #111827) fading into pure clean negative space across the entire left 60% of the horizontal canvas, with a soft rim vignette and faint volumetric haze.","elements":[{"type":"obj","bbox":[150,550,850,945],"desc":"A translucent glass rod of trapped sound resting on a dark machined spindle, a thin brass feeler tracing along its length and pressing evenly spaced notches into the glass, each notch filling with pale light just behind the moving feeler. Clean unbranded matte surfaces, blank panels, no printed markings. Razor-sharp detail, no text, no letters, no watermark."}]}}
@@ -0,0 +1 @@
{"high_level_description":"A dark-mode 3D cyber-bento product render of a single piece of industrial hardware, photographed on a seamless dark backdrop. The main high-detail 3D focal subject is positioned on the right side of the canvas, leaving clean dark negative space across the left side.","style_description":{"aesthetics":"modern dark cyber-bento, industrial precision, sleek machined surfaces, raytraced ambient occlusion","lighting":"volumetric studio rim lighting in royal cobalt blue (#4d82ff) with neon cyan (#22d3ee) and electric violet-magenta (#a855f7) synaptic glow and subtle cyan glow","medium":"3d_render","art_style":"octane render, matte obsidian hardware, frosted acrylic glass, precise machined surface detail","color_palette":["#0B0F19","#111827","#1E293B","#22D3EE","#A855F7","#4D82FF"]},"compositional_deconstruction":{"background":"Deep midnight obsidian slate background (#0b0f19 to #111827) fading into pure clean negative space across the entire left 60% of the horizontal canvas, with a soft rim vignette and faint volumetric haze.","elements":[{"type":"obj","bbox":[150,550,850,945],"desc":"A row of slender dark glass cylinders standing upright on a machined rail, a single horizontal blade bar sweeping across them and cutting every one at exactly the same height, the severed upper segments laid out in a shallow tray beside the rail. Clean unbranded matte surfaces, blank panels, no printed markings. Razor-sharp detail, no text, no letters, no watermark."}]}}
+3 -1
View File
@@ -15,6 +15,7 @@
"every-player-stuttered-the-file-was-fine": "A perfectly aligned dark film canister whose internal sprocket teeth sit one notch out of phase, casting a doubled ghost shadow onto a translucent glass slab",
"five-step-ai-roadmap-what-i-actually-run": "A five-tier architectural staircase in dark graphite, the middle tiers brightly illuminated with active hardware racks while the speculative top tiers remain skeletal wireframes",
"fully-on-chain-svg-nfts": "A crystalline art plaque sealed completely inside a transparent contract block, its imagery carved directly into the block's inner facets rather than mounted on any external frame",
"generating-subtitles-for-songs-without-timestamps": "A translucent glass rod of trapped sound resting on a dark machined spindle, a thin brass feeler tracing along its length and pressing evenly spaced notches into the glass, each notch filling with pale light just behind the moving feeler",
"hardening-a-tor-onion-service": "A matte black multi-shell relay tower of stacked concentric domes, each layer locked by a brass ring, with a single narrow sealed ingress slit glowing soft violet",
"hello-world": "A minimal dark workbench holding one glowing filament cursor hovering above a blank obsidian slate, first light spilling from a small pulsing pinpoint of light at its corner",
"how-i-built-the-digikedai-telegram-bot": "A folded paper-plane shaped obsidian drone docked at a glowing delivery dock module, tethered by a luminous thread to a private gateway pylon behind it",
@@ -71,5 +72,6 @@
"why-your-cdp-clicks-silently-fail": "A high-precision robotic cursor pointer clicking onto a translucent glass pad that has already shifted away on an invisible kinetic wave, triggering no resonance",
"why-your-grafana-dashboard-shows-no-data": "A wide wall of forty-one dark telemetry panels all reading blank, one small self-referential filter disc visibly stuck against its own inlet",
"why-your-headless-browser-cant-scrape-everything": "Two identical dark vault chambers side by side, one sealed shut behind a wall of blank grey panels while the other stands open with warm light spilling from inside",
"your-disk-full-alert-is-lying": "A tall nearly empty barrel of enormous capacity with a tiny amber fill line at its base, while a thin illuminated arc above it strains against its stop"
"your-disk-full-alert-is-lying": "A tall nearly empty barrel of enormous capacity with a tiny amber fill line at its base, while a thin illuminated arc above it strains against its stop",
"yue2-on-a-12gb-gpu-songs-that-lost-their-endings": "A row of slender dark glass tubes standing upright in a black rack on a machined rail, a single horizontal blade bar sweeping across them and cutting every one at the same height, the severed upper segments laid out in a shallow tray beside the rail"
}
+14
View File
@@ -239,6 +239,13 @@
"prompt": "A crystalline art plaque sealed completely inside a transparent contract block, its imagery carved directly into the block's inner facets rather than mounted on any external frame",
"caption": "captions/fully-on-chain-svg-nfts.json"
},
{
"slug": "generating-subtitles-for-songs-without-timestamps",
"unique_elements": "A translucent glass rod of trapped sound resting on a dark machined spindle, a thin brass feeler tracing along its length and pressing evenly spaced notches into the glass, each notch filling with pale light just behind the moving feeler",
"prompt": "A translucent glass rod of trapped sound resting on a dark machined spindle, a thin brass feeler tracing along its length and pressing evenly spaced notches into the glass, each notch filling with pale light just behind the moving feeler",
"evidence_summary": "18 songs - 342 lines - 0.96 anchor coverage",
"caption": "captions/generating-subtitles-for-songs-without-timestamps.json"
},
{
"slug": "hardening-a-tor-onion-service",
"title": "Hardening a Tor Onion Service: What Actually Matters",
@@ -1083,5 +1090,12 @@
"evidence_summary": "3% free = 500 GB · alert fires wrong way",
"prompt": "A tall nearly empty barrel of enormous capacity with a tiny amber fill line at its base, while a thin illuminated arc above it strains against its stop",
"caption": "captions/your-disk-full-alert-is-lying.json"
},
{
"slug": "yue2-on-a-12gb-gpu-songs-that-lost-their-endings",
"unique_elements": "A row of slender dark glass tubes standing upright in a black rack on a machined rail, a single horizontal blade bar sweeping across them and cutting every one at the same height, the severed upper segments laid out in a shallow tray beside the rail",
"prompt": "A row of slender dark glass tubes standing upright in a black rack on a machined rail, a single horizontal blade bar sweeping across them and cutting every one at the same height, the severed upper segments laid out in a shallow tray beside the rail",
"evidence_summary": "12 takes - all 240.000 s - cap now 300 s",
"caption": "captions/yue2-on-a-12gb-gpu-songs-that-lost-their-endings.json"
}
]