---
name: "wechat-material"
description: "Produce WeChat Official Account assets: 900x383 lead-story cover, 500x500 second-story cover, body images plus 1080x1440 card images, and a phone preview, then export docx/pdf/zip. Use when the user asks to \"make a WeChat Official Account cover\", \"produce WeChat Official Account card images\", \"make the images for this WeChat Official Account article\", \"render cards from a job sheet\", or \"export a WeChat Official Account document\". Not for publishing (use ai-trend-publish or publish manually)."
---

> Original skill · commissioned by the user · English edition, 2026-11-12

# WeChat Official Account asset production

## Scope

Visuals and deliverables only: covers, body images, card images, previews, export bundles.
**Never touch the Chinese body copy**: titles, sentences and fact lists are read-only; log problems in `qa/` instead of editing the copy. Publishing is out of scope for this skill.

## Input contract

Each batch takes two inputs; if either one is missing, stop:

1. `brief.md`: topic, section, word count, sources, acceptance criteria.
2. The YAML header at the top of `copy/*.md` (if any field is missing, raise an error — **do not fill it in for the user**):

```yaml
id: A1
title: From November, unpaid social insurance draws a penalty of up to 3x: the "voluntary waiver" paper does not count
dek: The new rule is not a new penalty, it is a unified discretionary yardstick.
cover: { ratio: "2.35:1", text: "This paper is useless now", style: "torn paper + red stamp + dark backdrop" }
cards: 7
sources: [{ id: s1, name: Guangming Online, url: https://..., date: 2026-10-17 }]
```

## Spec table (hard requirements, non-negotiable)

| Purpose | Size | Ratio | Notes |
|---|---|---|---|
| Lead-story cover | 900×383 | 2.35:1 | Mobile crops to this ratio |
| Second-story cover | 500×500 | 1:1 | |
| Body image | 1080×1440 | 3:4 | Or 16:9; use only one per batch |
| Card image | 1080×1440 | 3:4 | Export at 2x |
| Phone preview | 375px wide | — | At least 1 per batch |

## Visual rules

- Fonts: Source Han Sans / Alibaba PuHuiTi; bold titles, regular body. **Never set Chinese in Western monospace fonts such as Consolas**.
- Palette: deep blue-black `#111827`, signal orange `#F97316`, off-white `#F8F5EF`; finance charts may use red/green, never fluorescent colours.
- One layout system: small tag top-left (society / tech / finance / entertainment) + large type in the middle + signature at the bottom. Series consistency beats novelty.
- Cover text: 6–10 characters, two lines maximum; line 1 carries the conflict or the number, line 2 carries the subject or the outcome; **do not paste the title in as-is**.
- Charts must state data source, time and unit; conceptual graphics carry the label "illustrative, not measured".
- One image per 300–500 characters; do not pile up images.

## Three-platform operating guidelines (confirmed by the user; outranks the defaults in this section)

- **Covers use the full-bleed B layout only**: image fills the frame + left-side gradient + white type; **no brand mark bottom-left, no page number or caption bottom-right**.
- **The three formats never borrow from each other**: the cover lives on impact (big type over the image), a body image is a photo + one line of caption, a card image is an information card (big number + title + body + source); body images must not reuse the cover's big-type layout, and card images must not reuse the cover's whitespace.
- Card images carry no small footer type either.
- Tools and parameters: `tools/wechat/cover.py` (`layout=full`, `show_footer=false`, `show_credit=false`), `card.py`, `figure.py`; run `preflight.py` before delivery.
- Full guidelines: `<WORKSPACE>/operations/three-platform-guidelines.md`.

## Image sourcing and compliance (user's rule: real event images come first)

**The lead image must be a real event image.** A real event image = a news-scene photo, an official release/poster/still, an official announcement or press-conference screenshot, a public image from the party involved (video screenshots count too). AI-generated images and free-stock illustrations **may not be the lead image**.

Quota (same basis per article and per batch):

| Type | Ceiling | Target |
|---|---|---|
| AI-generated images | ≤20% | 0 |
| Free-stock illustrations | ≤30% | 0 |
| Real event images | no ceiling | 100% |

Selection order: real event image → official/party-involved release → media screenshot → stock library (atmosphere only, must be labelled "illustrative, not on site").

Three hard limits:

1. **Never fake the scene** — do not label a generated or illustrative image as an on-site photo.
2. **Never AI-composite a real face to pass as the person involved**, and never make derogatory edits.
3. **Never take someone else's whole article or whole image set as your own**; a single image must carry one line of source + date.

Caption format: `Source: <outlet/institution> <reporter or section>, <YYYY-MM-DD>`; within one article prefer assets from the same event; when there is no image of the same event, cut the number of images rather than passing a stock image off as on-site.

Render script: `tools/pipeline/render_real.py --manifest <articles_real.json>` (the lead image must be a real image for `cover`; a missing image is a hard error); source retrieval lives in `<WORKSPACE>/realimg/{orig,fetch}.py`.

Other required notices to keep: finance copy never says "guaranteed to rise / buy the dip / risk-free profit" and ends with "not investment advice"; social-issue copy exposes no privacy and stirs no regional/gender/occupational hostility; entertainment copy does not make minors the topic.

## Asset review (veto; clear it before you start)

**Review the topic → review the images → re-check before delivery.** All three gates must pass before production. Any hit in the table below stops the batch; it does not enter rendering.

| Category | Concrete forms (any hit = stop) |
|---|---|
| Disability | Disabled people as subject/joke, "misery-selling" narratives, close-ups of disability traits, disability used as metaphor |
| Religion | Religious figures, rituals, scriptures, the interior of religious sites, religious symbols mocked or used as decoration |
| Military | Serving personnel, uniforms and ranks, military vehicles and equipment, barracks, exercises, classified units |
| Politics | Portraits of politicians, party/state emblems and flags, political slogans, sensitive maps, assemblies and protests, taking sides in a policy dispute |
| Incidental | Close-ups of minors, disaster and accident scenes, gore, identifiable private information |

Decision process:

1. **Topic review**: run the title/summary through the keyword check first; a hit sends it back for a new angle — no "blur it and use it".
2. **Image review**: before searching or generating, list the sources and check what the subject of each one is; do not render first and review afterwards.
3. **Re-check**: before delivery write the review conclusion into `00-delivery-notes.md` — which items passed, what was avoided.
4. **When unsure, stop**: ask the user, default to not doing it; never downgrade on your own to blurring, mosaic or recolouring.

Boundary: livelihood policy (social insurance, medical insurance, tax, employment) is in scope, covering clauses and impact only, **with no politicians, no party/state emblems, no political slogans, no maps**. Social news covers facts and what the people involved are asking for, with no group-against-group framing.

## Production flow

1. Read `brief.md` and `copy/*.md`; list every article's `cover.text` and `cards` count.
2. Produce 1 lead-story cover + 1 card image as **proofs** first; batch render only after the layout is confirmed.
3. Batch render into a temporary directory, naming by the rules in the next section.
4. Run the QA gate (table below); if it fails, re-render — nothing enters the delivery directory.
5. Write to `<WORKSPACE>/<platform>/<batch>/`, write `00-delivery-notes.md`, update `<platform>/INDEX.md`.

## QA gate (every item must yield a number)

| Check | Pass criterion |
|---|---|
| Size | Pixel-exact against the spec table (read it with an image tool, not by eye) |
| Type size | At 1080 wide: main title ≥96px, subtitle ≥56px, body ≥40px |
| Contrast | Text against background ≥4.5:1 |
| Text volume | Cover ≤10 characters; single card image ≤120 characters |
| Render integrity | No tofu boxes, no overflow, no clipping; eyeball one image character by character for Chinese |
| Sourcing | Every chart has source + time; conceptual graphics are labelled |
| Lead image truth | The lead image is a real image of that event (news photo / official still / announcement screenshot / party-involved footage), not an AI image or a stock illustration |
| Image mix | Per article AI images ≤20%, stock illustrations ≤30% (target 0); every caption states source and date |
| Naming | Matches `<8-digit date>_<topic>_<purpose>.ext` |

## Delivery layout

```
<WORKSPACE>/<platform>/
  <batch>/
    <YYYYMMDD>_<topic>_lead_cover.png
    <YYYYMMDD>_<topic>_second_cover.png
    <YYYYMMDD>_<topic>_card01.png … _card07.png
    <YYYYMMDD>_<topic>_phone_preview.png
    <YYYYMMDD>_<topic>_body.docx
    <YYYYMMDD>_<topic>_body.pdf
    00-delivery-notes.md
  INDEX.md
```

- Filename = **8-digit date + topic keyword + purpose**; revisions add `_v2`, and words like "final / really final / new" are forbidden.
- `00-delivery-notes.md` starts at three lines: what shipped, where each image goes, what is still missing.
- Every delivery must also update the top row of `INDEX.md`, stating "files in this batch that can be published now".

## Common failures

| Symptom | Handling |
|---|---|
| Chinese turns into boxes | The font has no CJK coverage; switch to Source Han Sans / PuHuiTi, and never use a Western monospace font |
| Title gets cropped | Preview at 375px wide first, then settle line count and type size |
| Correct size but the upload is rejected | The platform requires jpg/png under 10MB; above that, compress at 90% quality |
| YAML field missing | Raise an error and list which fields are missing; do not guess the content |
