把所有本地 demo / 测试 / 上传图 / 调试脚本搬入 local-tests/,写 .gitignore 忽略整个测试目录与 node_modules/。本次起 skill 仓库 只跟踪:SKILL.md / HANDOFF.md / PRODUCT.md / assets/(3 模板)/ references/(15 规则文档)/ agents/openai.yaml / validate-social-deck.mjs / package.json + lock。 历次版本(v0.1-v0.12)的全部实质改动已包含在当前文件状态中—— HANDOFF.md 的版本历史段保留作为时间轴文字记录,但代码层面以 此 commit 为唯一基线,后续逐次 commit 对应 HANDOFF.md 新增段落。 HANDOFF/PRODUCT/category-cookbook/components/style-system 中的 demo 路径引用已加 local-tests/ 前缀。SKILL.md Step 5 line 190 的 'social-card-<slug>/' 是下游用户工作区的命名约定,未改动。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.6 KiB
4.6 KiB
QA Checklist
Run this before final delivery.
Dimensions
- Rednote images are
1080 x 1440. - WeChat 21:9 cover is
2100 x 900. - WeChat 1:1 cover is
1080 x 1080. - WeChat pair preview exists in the same HTML when WeChat covers are requested.
- File names are stable and ordered.
Text
- No text overflows or touches the edge.
- No content collides with
.foot/.issue-strip. If body copy or a closing line is overlapping the page footer, the footer is probablyposition: absolutewhile content above grew. Switch to flexmargin-top: auto(see Anti-pattern C instyle-system.md). - Cover title is readable on a phone at thumbnail size.
- Body text is not smaller than it needs to be.
- Chinese line breaks are intentional.
- Important product names, English terms, and code snippets are spelled correctly.
- Captions match the source text; no invented facts.
Layout
- Each page has one clear focal point.
- Pages do not all use the same structure.
- Lower empty space is either intentional or fixed.
- Images and screenshots align to the grid.
- Screenshot pages give the screenshot enough area.
- 1:1 WeChat cover uses a simplified short title and is composed separately, not blindly cropped.
4-band Density Check (3:4 only — run after render)
Open the rendered PNG. Mentally divide it into 4 horizontal bands of 360px each (0-25%, 25-50%, 50-75%, 75-100%). For each band, classify as:
- Filled — contains text, image, data, or rule.
- Justified empty — empty for a stated reason: hero-image breathing (M01/M16), single-sentence statement (M04/M13), leading/trailing margin (top 8% / bottom 8%).
- Under-filled — empty with no reason. Any single under-filled band > 15% canvas height (>216px) is a fail.
A poster passes when:
- Total Filled + Justified empty ≥ 100%.
- Filled bands cover ≥ 75% canvas height (≥ 1080px of 1440px).
- No two adjacent bands are both "justified empty" — that creates a >25% void mid-poster.
If failing: don't shrink the canvas, don't add decorative blobs. Either expand copy (more ledger items, longer paragraphs, supporting evidence row, marginalia column) or switch recipe (M07 → M04 for genuinely-short content; M03 → M11 to add a marginal column; thin ledger → M08 Tall Ledger with bigger rows).
Style
- Package uses one visual system.
- Swiss identity test passes for every Swiss poster (see
style-system.md"Style Identity Test"). In particular: every display title >=72px uses a typed class with weight <=300; no serif font is loaded; only one accent color is used. A bold 90px headline is not Swiss. - Editorial identity test passes for every Editorial poster: at least one atmosphere layer beyond a flat fill (paper grain / ink wash / WebGL); serif display family on the title; at least one of large photo well, serif pull quote, marginalia column, or true ledger structure. A flat paper with serif title + mono pills everywhere is Swiss-in-disguise.
- Swiss uses one accent color only.
- Magazine style uses restrained paper/ink tones.
- No random SVG blobs, ovals, drops, circles, stickers, or decorative gradients.
- No nested cards.
- No excessive rounded corners.
Images
- Supplied images are not distorted.
- Faces, hardware, product UI, and key text are not accidentally cropped.
- Screenshots remain readable.
- Generated images do not contain unwanted text, logos, page numbers, or poster borders.
- Photo crops feel intentional.
- For any image fetched from the web (Pexels / Unsplash / Flickr CC / Wallhaven / direct search): the source URL is recorded in
assets/SOURCES.md, and the user has been asked whether to add an in-image attribution caption. The user's answer is honored. Flickr CC attribution preserves the author name when the user opts in.
Text-On-Image (when applicable)
Run these only for posters where text touches a photo (full-bleed cover, large image well, generated overlay). See references/image-overlay.md.
- Image area ≥60% of canvas → A, B, or C contrast mask is present (not a flat black rectangle behind text).
- Subject map is documented as an HTML comment next to the hero block (face / focal feature location + safe zones).
- No display title (≥72 px) overlaps a face, hand, or key product feature.
object-positionwas chosen from the subject-location table, not left at default for face shots.- Thumbnail test: downscale the rendered PNG to 360 px wide and confirm the title is still legible without strain.
Final Response
- Include the output path.
- Show the main cover inline when useful.
- Mention verification performed.
- Mention any limitations, such as low-resolution source assets.