oc-halloween-icon-sheet

Community@sumino/oc-halloween-icon-sheet
Community skill — not reviewed. It was shared by Jagulus and has not been checked by Neta. Read SKILL.md below before letting an agent use it.
Use it in Cohub

Paste this into your agent's chat — it fetches the skill and follows it.

Use the skill: oc-halloween-icon-sheet. Run `npx -y @neta-art/neta-search-cli@latest skills use @sumino/oc-halloween-icon-sheet --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use @sumino/oc-halloween-icon-sheet
Summary

Turn your character into a sheet of 16 black-silhouette Halloween stickers, ready to tap, save and share in 12 languages.

  • One white sticker sheet with 16 icons in a 4×4 grid, each in a dashed cut-out cell with crop marks in the corners.
  • Every icon mixes a Halloween object with your character's own symbol: a pumpkin with their eye, a witch hat with their horns, a tombstone with their name.
  • Flat black shapes with small touches of orange, purple and one accent colour. No full portraits, just props and details.
  • Captions under each icon switch between 12 languages, including right-to-left Arabic. Tap any sticker to save it as its own image.
  • Works best for a character with distinctive features, outfits, pets or a home. It is published as a web page and placed on your board.
SKILL.md
# OC Halloween Icon Sheet

A single white sheet of sixteen die-cut icons. None of them is a portrait: each one pairs a Halloween object (pumpkin, hat, cat, ghost, castle, cauldron, tombstone, horse, bat, spider, spell book, candy, broom, record, moon, dead tree) with one of the OC's own symbols, drawn as a flat black silhouette with two or three accent fills. The sheet looks like a real sticker/cut page — dashed cut lines, crop marks, a title, a cutter note — and every word on it is live HTML, so the same sheet speaks twelve languages.

**Live demo:** https://neta.art/w/sumino/sweet-nightmare-park/pipo-halloween-icons
**Starter:** `templates/` holds the working page (HTML/CSS/JS + fonts); `assets/demo-cover.webp` is the gallery preview.

## What the user gets

- A pure-white 4×4 sheet, 16 icons in row-major order, each inside a dashed die-cut cell with crop marks at the sheet corners.
- Flat vector silhouettes: solid black mass, sharp edges, shape and negative space; small orange / purple / OC-accent fills only. No gradients, no realistic light.
- Every icon is a Halloween motif fused with an OC symbol — a jack-o'-lantern carved with the character's spiral eye, a witch hat growing the character's horns, a cat collar carrying the character's pendant, a tombstone engraved with the character's name, a castle shaped like the character's home.
- Live captions under each icon, five rotated bilingual stamps, a live engraved name on the tombstone, and a footer with cut/save/sheet labels.
- Twelve complete locales, system-language detection, English default and fallback, a manual selector, Arabic RTL.
- Tap-to-save: each icon downloads as its own WebP.
- A published Work and a Board card.

## When to use

Use when the user wants a set — not a single poster — of character-specific Halloween icons, stickers, cut templates or avatars:

- "Halloween icon sheet", "sticker sheet", "图标合集", "贴纸合集";
- "cut template", "die-cut sheet", "printable stickers";
- an OC symbol system built from props and motifs rather than the full character.

Do not use for:

- one large illustration — generate a single image or a cover skill;
- a ticket or stub — `halloween-ticket-keepsake`;
- a book cover — `oc-coloring-book-cover`;
- game sprites with animation frames — the sprite/asset-sheet skills.

## Hard rules

0. **Use the sandbox CLI path.** Every `neta` command is `node /mods/neta/neta …` (`neta` may not be on PATH).
1. **Read the OC before drawing.** Use the world's real atom, cover and `## 形象参考`. Build the symbol list from *that* character; never reuse the demo's 16 slots on another OC.
2. **No text in the generated sheet.** No captions, no letters, no numbers, no watermark. All type is HTML. The one exception is a proper name engraved on a tombstone, and even that is an HTML overlay positioned over the blank stone.
3. **No full character.** No face, no body, no chibi. If an icon reads as a portrait, replace it with a prop or a body detail.
4. **A 4×4 grid reference is mandatory.** Never prompt a 16-slot sheet from text alone. If the platform's guide file is corrupt, rebuild it with `scripts/make-grid-guide.sh` (see Pitfalls).
5. **One icon per cell, same scale.** Every icon about 65–75% of its cell, centred, with at least 32 px safe padding at 1024. No icon crosses a cell border.
6. **Black is the主体.** Black carries the silhouette, the caption and the structure. The accent is a highlight, not a second palette: one orange, one purple, one OC accent, used in small areas.
7. **Crop by component union, not fixed slices.** Sticker confetti (dots, stars, mini bats) belongs to its icon; a union crop keeps it, a fixed cell slices it, and "largest component only" drops it.
8. **Twelve complete locales × 16 phrases.** English is default and fallback. No missing phrase, no `undefined`.
9. **Publish and place.** A source page without a published Work and a Board card is not shipped. Place the **web Work** card, never the raw sheet.

## Pipeline

### 0. Read the OC and build the 16 slots

```bash
node /mods/neta/neta atom list --type character
node /mods/neta/neta atom get "world/characters/<Name>.md"
node /mods/neta/neta find images "<Name>"
```

List 6–10 signature symbols from the cover and `## 形象参考`: body features (horns, ears, eye, hair), garments, held objects, powers, pets, home architecture, a number or name.

Then write 16 pairs, each `Halloween object × OC symbol`:

| # | Halloween object | OC symbol | Icon idea |
| --- | --- | --- | --- |
| 1 | jack-o'-lantern | the character's eye / rune | carved face is the eye |
| 2 | witch hat | horns / hair ornament | horns grow from the brim |
| 3 | black cat | collar pendant / pet | collar holds the token |
| 4 | ghost | gesture / collected object | ghost hugs the object |
| 5 | castle | home zone architecture | castle shaped like the home |
| 6 | cauldron | ability / power glyph | glyph floats above |
| 7 | tombstone | name / number | name engraved (HTML overlay) |
| 8 | carousel horse | vehicle / mount | horse with the character's wings |
| 9 | bat | eye / emblem | emblem on the chest |
| 10 | spider | third eye / mark | mark on the back |
| 11 | spell book | signature book / seal | cover carries the seal |
| 12 | candy | signature colour / crystal | crystal core |
| 13 | broom | cape / ribbon | cape tied to the handle |
| 14 | record | recorded screams / voice | label is the accent |
| 15 | moon | eye / beam | eye in the crescent |
| 16 | dead tree | collected objects | objects hang like fruit |

Keep each idea to one silhouette. If it needs three objects to read, it is too complex for a 100 px icon.

### 1. Create the page work

```bash
SLUG="<name>-halloween-icons"             # kebab-case, unique
WORK="works/web/$SLUG"
node /mods/neta/neta work init web "$WORK" --title "<Name> · Halloween Icon Sheet"
# The CLI may normalize works/web -> works/webs; use the printed workDir.
```

Copy the starter:

```bash
cp templates/index.html templates/style.css templates/app.js "$WORK"/
cp templates/content.example.js "$WORK/content.js"
cp -r templates/fonts "$WORK/fonts"
mkdir -p "$WORK/assets/icons"
```

`content.js` is the only per-OC data file. Replace every demo value, and keep the 16 `icons` entries in the same row-major order as the generated sheet.

### 2. Build the grid guide

```bash
bash scripts/make-grid-guide.sh /tmp/<slug>-grid.png
cp /tmp/<slug>-grid.png uploads/<slug>-grid.png
```

The second copy matters: `neta generate --image` rejects paths outside the workspace.

### 3. Generate the 4×4 sheet

Read `references/art-direction.md` for the full prompt and the 16-slot contract.

```bash
NETA_DEFAULT_IMAGE_MODEL=gpt-image-2 node /mods/neta/neta generate image \
  --work-title "<Name> · Halloween Icon Sheet · raw" \
  --work-description "<one sentence>" \
  --param size=2048x2048 --param quality=high --param output_format=png \
  --image "uploads/<slug>-grid.png" \
  --prompt "$(cat /tmp/<slug>-sheet.txt)"
rm -f uploads/<slug>-grid.png
```

The provider may return 1254×1254 even when 2048 is requested. The crop script reads the real size, so this is fine. The sheet is an **ingredient**; do not place it on the Board.

Before cropping, open the raw sheet and check it: 4×4, one icon per cell, no grid lines, no text, no icon crossing a border. Regenerate once if any cell is empty or merged.

### 4. Crop and QA

```bash
python3 scripts/crop-icons.py /tmp/<slug>-raw.png "$WORK/assets/icons" /tmp/<slug>-qa \
  "pumpkin,hat,cat,ghost,castle,cauldron,tombstone,horse,bat,spider,spellbook,candy,broom,record,moon,tree"
```

The ids are the same as `content.js` and the slot order. The script writes `<id>.webp` per icon, plus a numbered contact sheet and a crop log. **Look at the contact sheet.** Fix slots before building the page: a clipped icon, a stray fragment from a neighbour, or an icon that has drifted into the wrong cell means regenerate, not nudge.

Then measure the tombstone's blank stone face so the engraved name sits on it:

```bash
python3 scripts/measure-stone.py "$WORK/assets/icons/tombstone.webp"
```

It prints the grey face bbox as percentages; put them into `.engrave` in `style.css`.

### 5. Fill `content.js`

```js
window.SHEET = {
  name: "PIPO",
  sheetNo: "01",
  icons: [
    { id: "pumpkin", accent: "orange", stamp: 0 },
    { id: "hat", accent: "purple" },
    { id: "cat", accent: "crimson" },
    { id: "ghost", accent: "crimson", stamp: 1 },
    { id: "castle", accent: "orange", stamp: 2 },
    { id: "cauldron", accent: "purple", emph: true },
    { id: "tombstone", accent: "crimson", engrave: true },
    { id: "horse", accent: "purple", stamp: 3 },
    { id: "bat", accent: "crimson" },
    { id: "spider", accent: "purple" },
    { id: "spellbook", accent: "purple" },
    { id: "candy", accent: "crimson", emph: true },
    { id: "broom", accent: "purple" },
    { id: "record", accent: "orange" },
    { id: "moon", accent: "orange", stamp: 4, emph: true },
    { id: "tree", accent: "crimson" }
  ],
  stamps: [{ zh: "万圣节快乐", en: "Happy Halloween" }, /* …5 */],
  langs: { en: { label: "English", short: "EN", dir: "ltr" }, /* …12 */ },
  i18n: {
    en: {
      world: "Sweet Nightmare Park",
      title: "Pipo's Halloween Icons",
      subtitle: "Screaming Carousel · Sticker & Cut Sheet",
      cut: "Cut along the dashed lines",
      sheet: "Sheet 01 · 16 icons",
      save: "Tap a sticker to save it",
      language: "Language",
      close: "Close",
      phrases: [/* exactly 16, row-major */]
    }
    // … 11 more locales
  }
};
```

Rules:

- `icons` order **must** match the generated sheet order and the crop ids.
- `accent` is `orange`, `purple` or `crimson` (or add a fourth in CSS and data).
- `emph: true` paints the whole caption in the accent; otherwise only the star mark is coloured.
- `stamp` indexes into `stamps`. English readers see the Chinese line, every other locale sees the English line — the bilingual accent is intentional.
- `engrave: true` on the tombstone renders `name` over the stone; keep it to a short proper noun.
- `phrases` has exactly 16 entries, same order as `icons`.

### 6. Validate and QA

```bash
node scripts/validate-i18n.mjs "$WORK"
```

Then open `?qa=1` and require, for every locale:

- `captionOverflow: []`, `captionLines3: []`, `stampOut: []`;
- `titleLines` 1–2;
- `fitsViewport: true` and `pageScroll: 0` at 1440×900.

Follow `references/qa.md` for the mobile and RTL pass.

### 7. Publish and place

```bash
node /mods/neta/neta work publish web "$WORK"

node /mods/neta/.agents/skills/board-ops/scripts/place.mjs \
  --title "<Name> · Halloween Icon Sheet" \
  --work "works/webs/<slug>"
```

The publish returns the share link `https://neta.art/w/<user>/<world>/<slug>`. Verify it with `curl -sI` (200) before calling it live. Place the **web Work** card, not the raw sheet.

### 8. Package the skill (optional)

If the user asks for a reusable skill, copy this folder to `.agents/skills-drafts/<skill-name>/`, keep the demo as the worked example, write `SKILL.md` in English even when the world is Chinese, then follow `references/publishing.md` to submit it.

## Content model

```
$WORK/
  index.html
  style.css
  app.js
  content.js              # per-OC data; the only file that changes per character
  fonts/                  # Rubik Dirt + Rubik Wet Paint, self-hosted
  assets/icons/           # 16 cropped WebPs, <id>.webp
```

`index.html` and `style.css` are generic. The sheet is `.sheet` (container query source), the grid is `.grid` (4 columns), each cell is `.sticker` with a dashed die-cut border. All sizes are `cqw`, so the sheet scales as one object instead of reflowing.

`app.js` builds the 16 cells from `content.js`, applies the locale, swaps the bilingual stamps, sets the engraved name and the download filenames, and emits the QA report.

## Pitfalls

- **The platform grid guide may be corrupt.** `/mods/neta-skills/.agents/skills/referenced-4x4-asset-sheet/references/layout-guides/faint-4x4-sheet-grid.png` can ship as a broken PNG header. Check it with `identify`; if it fails, run `scripts/make-grid-guide.sh` and use that. Never fall back to a text-only 16-slot prompt.
- **`--image` cannot read /tmp.** Copy the guide into `uploads/` first, and delete it after generation.
- **The provider may ignore the requested 2048.** It often returns 1254. The crop script uses the real size; do not hard-code cell maths.
- **Fixed-cell slicing cuts sticker confetti.** Use the union crop. If an icon sits near a border, the union still keeps its own dots and stars but never the neighbour's.
- **A caption that fits in English can overflow in German or Russian.** Shorten the copy, do not shrink every caption. `?qa=1` names the offending icon.
- **CJK falls back to a system sans.** That is expected: Rubik Dirt has no CJK. The CSS uses a bold CJK stack; keep the caption size slightly smaller for CJK.
- **Arabic letter-spacing breaks joins.** Reset it under `html[dir="rtl"]` and `:lang(ar)`.
- **The die-cut look needs the dashed border and crop marks.** Without them it is just a grid of pictures.
- **A white sheet on a white page disappears.** Keep the crop marks and the dashed cells; Studio frames the Work anyway.

## Demo

The shipped example is Pipo from *Sweet Nightmare Park*: 16 icons built from her curled ram horns, single crimson spiral eye, third eye, crimson crystals, cape and the Screaming Carousel. The tombstone carries her name; five cells carry a Chinese/English stamp pair. Twelve locales. It is a demo, not a constraint.