RedNote Carousel
Content structure comes first. Chinese typography must remain deterministic and editable.
Inputs
Require a reader promise, audience, claim ledger or approved content, desired card count or range, brand context, and publication constraints. If facts are not sourced, invoke research-claims before visual production.
Visual-target gate
Use an existing brand or selected direction when available. For greenfield work without a target, generate exactly three image-based directions that differ in composition, typography, density, color, and illustration behavior. Wait for selection before producing the final cards.
Workflow
- Create a narrative spine: cover promise, tension, claims, proof, practical steps, counterpoint, and close.
- Assign one job and one primary claim to each card. Preserve claim identifiers in card metadata.
- Write concise Chinese copy. Do not distort certainty or remove essential caveats for engagement.
- Define editable content, layout, and style tokens separately.
- Render all Chinese text with deterministic HTML/CSS, SVG, Canvas text, or another typography engine with known fonts.
- Use generative imagery only for non-text illustration, texture, or photography. Never ask an image model to spell Chinese copy.
- Export individual PNGs, an overview contact sheet, caption copy, source ledger, and machine-readable manifest.
- Test every card for overflow, line breaks, safe area, contrast, font fallback, cross-card consistency, factual traceability, and export dimensions.
Staged renderer fast path
Use the bundled scripts/render_carousel.py before writing a custom renderer. It resolves one exact font file, draws every text run with that file, stages the complete card batch and contact sheet, and writes the hashes, manifest, and validation report in one command.
Create carousel/content.yaml as JSON-compatible YAML and carousel/tokens.json, then copy the active skill's renderer into the evidence packet and execute it:
mkdir -p carousel
cp <active-skill-directory>/scripts/render_carousel.py carousel/render.py
python3 carousel/render.py --content carousel/content.yaml --tokens carousel/tokens.json --out carousel
The content object contains title, reader_promise, caption, card_count_range, claims, and cards. Each claim has id, text, confidence, and optional source. Each card has id, kicker, title, body as an array, claim_ids, optional accent (evidence or failure), and optional footer.
The token object may override canvas, safe_area, colors, type, font_candidates, and mono_font_candidates. Put preferred CJK body font and monospace label font files first. If a label font lacks a CJK glyph, the renderer records the fallback and draws that label with the resolved body font. The renderer fails if no body candidate can be loaded, required glyphs are missing, the card count is outside the requested range, any measured element leaves the safe area, content enters the footer safe area, any required claim is unmapped, or a required color pair falls below WCAG AA contrast.
Do not install a browser stack, author a replacement renderer, or debug per-card screenshot sessions before trying this path. If Pillow is unavailable, make one bounded probe for an already installed deterministic vector or browser renderer. Report a blocker if that probe fails.
Production-package intent gate
Treat requests for a production package, editable carousel package, export manifest, rendered cards, or contact sheet as explicit requests to create those artifacts now. A simultaneous request for a validation plan does not downgrade production into a plan-only deliverable. Run the staged renderer and require the actual files listed under Deliverables. Do not satisfy the request with a manifest skeleton, future file tree, or planned-not-rendered document when the production outputs were requested.
Bounded production contract
Build for reliable completion before optional polish:
- Create the editable content, tokens, claims mapping, card source, caption, and manifest skeleton first.
- When the requested range allows it, use the smallest card count that preserves the narrative and all approved claims.
- Render every card and the contact sheet in one batch process. Do not open a separate interactive browser session for each card.
- Run one complete validation pass across the batch.
- Make at most one focused correction pass for failed required checks, then rerender only affected outputs and refresh the contact sheet and hashes.
- When the required deliverables exist and required checks pass, stop. Report optional visual refinements or unresolved platform uncertainty instead of continuing to iterate.
Do not add optional generative imagery, animation, extra cards, or alternate themes until the required package is complete and the execution budget clearly permits it.
Reserve the final response for a concise delivery summary, validation result, reproduction command, and artifact paths. Do not paste full generated source files into the response. Once the staged renderer reports passed: true, stop.
Deliverables
carousel/
content.yaml
tokens.json
render.py or cards.html or cards.svg
exports/01-cover.png ...
contact-sheet.png
caption.md
claims.csv
manifest.json
The manifest records card number, title, primary claim IDs, dimensions, file hash, declared fonts, verified font availability, render engine and version, and export timestamp. It must not label a font as resolved from computed CSS alone. The bundled renderer may label its exact font file as resolved because Pillow loads that file directly for every text draw; it records the path and SHA-256 as evidence.
Card checks
- The cover makes one defensible promise, not a vague topic label.
- Body text remains readable at phone scale.
- No important text enters platform or crop safe areas.
- Long words, punctuation, mixed Latin text, and numbers wrap intentionally.
- Color is not the only carrier of meaning.
- Font fallback does not change line breaks silently.
- A CSS
font-familyvalue or fallback list proves only what was declared, not which font rendered each glyph. Font availability checks also do not prove actual glyph resolution. Record declared fonts and availability separately; claim a resolved font only when the renderer exposes that evidence. Otherwise state the uncertainty. - Visuals do not add unsupported factual detail.
- Caption citations map to the same claim ledger as the cards.
- Every factual sentence on a card is supported by all claim IDs needed for that sentence. Do not add a causal explanation, benefit, or recommendation as if it came from the ledger. Label necessary connective copy as editorial synthesis and keep it clearly separate from sourced claims.
- Restrained monospace labels use a separately resolved font file. When a label contains unsupported CJK glyphs, record the explicit fallback to the resolved CJK body font.
Evidence packet
Return the editable source, exports, contact sheet, caption, claims, manifest, render and validation commands, failures corrected, and remaining platform-specific uncertainty.