$ cat SKILL.md

Revisione Visiva

// Review the images a workspace node drew (slide layouts, a brand master, a deck) one at a time against nine named checks: fit, breaks, overlap, contrast, balance, spacing, alignment, hierarchy and size, consistency and content. Each image's row records what you read and measure first (its title, the title against the body, where the content ends), a verdict for every check, and the problems that follow. The row is saved to a record node on the canvas right after each image, so the review survives a long run and a compacted context; fix once with the fixes the calling instruction allows, and report what is still open. Use it when an instruction has a step that looks at rendered output and names the node with the images, the record's label, what image n shows, the checks that apply and the fixes allowed. Needs the viewNodeImages tool; without it the review is skipped.

Pin it asmarketplace/revisione-visiva@1.2.0

About 1883 tokens: an agent gets it whole in its prompt.

// Instruction

SKILL.md

Revisione Visiva

Overview

This is a procedure other instructions follow. A workspace template pins it in its skillDeps; it is never a workspace to build. Where an instruction and this skill differ, the instruction wins. It looks at a node's images one at a time, judges each against named checks, and keeps one row per image in a record on the canvas. The rows are the review, not your memory of the images: an image is in your view for 2 responses only.

The Review

Run it where an instruction says so, with that instruction's node, record label, image meaning, checks and fixes. Only when your tools include viewNodeImages; without it, skip the review and say the images are on the node for the user to check.

  1. The record first, before anything else: upsertNode({ templateId: "e2f17399-93c7-4b84-8aa5-8aa725fa0fab", label: "<record label>" }) (a JSON Object node, wired to nothing). One already there from an earlier review → deleteNode it first.
  2. Run the images node (nodeExecutor) and wait. It failed → deleteNode the record, skip the review and report it.
  3. One image at a time. viewNodeImages({ nodeId: "<images node id>", key: "images", offset: 0, limit: 1 }). Each image comes labelled "Image n of N". The response right after each holds two tool calls and no other text: first upsertNode({ nodeId: "<record id>", appendInput: { value: [ { "image": <n>, "shows": "<what image n is, as the instruction says>", "title": "<the title, word for word, or NONE>", "titleVsBody": "<larger, same or smaller than the body text, or no body>", "mainText": "<the main text, word for word as you can read it>", "contentEnds": "<how far down the lowest text or element ends, as a % of the image height>", "empty": "<where the largest empty area is>", "firstSeen": "<what the eye lands on>", "checks": { "<check number>": "<ok or problem, with a few words when the call was close>" }, "problems": [ { "check": <number>, "element": "<the element>", "problem": "<the problem>" } ] } ] } }), then viewNodeImages with offset: <n>, limit: 1 for the next image. A response with only text ends your turn.
    • Write the fields in that order: what you read and measure first, then a verdict for every check the instruction applies, the problems last, from those fields (step 4). Every check marked problem is also in problems.
    • Save before you move on. The row is the only copy of this image's review that lasts: your thinking about it is dropped from the context later, and a long review is compacted. Everything you concluded about the image goes in its row; nothing stays only in your thoughts.
    • A row says only what you see in the image in view. Never write a row for an image no longer in view: view it again.
    • After any break (an error, a new turn, a message from the user, "continua"), no image is in view: view the next image again before you write its row, even one you saw before the break.
    • The response after the LAST image holds its row and then step 6's nodeFinder, in that order: never end the turn between them.
    • "problems": [] means the image passed every check that applies.
    • An image in the result's skipped could not be viewed: its row says "notViewed": true and counts as open.
    • A result with success: false or no total means you are not seeing the images: write no more rows, stop, keep the record and report what it holds.
    • After the last image, the record holds one row per image. A row missing → view that image again and write it.
  4. The checks. Go through every check the instruction applies, for every image. A check fails only on something you can point at: never invent a problem. Sample text and an empty photo area are expected where the images are previews of layouts or a master; in a finished deck, sample text left in place fails check 9. The row's fields decide these, never a second impression: title NONE on a content image, titleVsBody same or smaller, contentEnds at or under 58% on a deck image with more than one item.
    1. Fit: text cut off, out of its box or past the edge, or ending in "..." where the source did not.
    2. Breaks: a word split in two, one word per line, a number apart from its unit, a text box so narrow that most of its lines hold one or two words.
    3. Overlap: text through a shape, a line or other text; a footer, a source line or a decoration over the content.
    4. Contrast: text or an icon hard to read on what is behind it. Main text you cannot read, so mainText is empty or partial, fails here even when you see nothing: text the colour of its background is invisible, not absent. A page number does not count.
    5. Balance: a large empty area in one place while another is cramped. On a deck image with more than one item, contentEnds at or under 58% (the lower 42% left empty) fails here. Space around a single message is deliberate.
    6. Spacing: under about 4% of the width to an edge, cards nearly touching, different gaps between similar elements.
    7. Alignment: elements of one role not on one edge, cells of one grid of different sizes.
    8. Hierarchy and size: the eye does not land on the main thing first, a title not larger than the body text (titleVsBody same or smaller), or body text too small to read in a room.
    9. Consistency and content: a content image with no title (title NONE) unless the instruction says that image has none (a cover photo, a divider, a layout without a title slot), two images with the same title, titles at another height, size or case than on the other images, mixed languages, two images that look the same, a style the instruction names not applied, a number with no unit, sample text left in a finished deck ("Titolo, 3-6 parole", "Lorem ipsum"), or an item that says nothing ("Nessun altro rischio", "N/A") placed to fill a count.
    • One layout, one verdict: a problem the layout causes (a small title, an empty lower half) is on every image drawn from that layout: write it in each of their rows, never in some.
    • A round with no problem is checked once more: every row has "problems": [] → before step 6, view the first and the last content image again and go through checks 5, 8 and 9 against their rows' fields. Write a new row for each, with "recheck": true, from the image in view: a problem it lists then counts like any other.
  5. Fix once, only with the fixes the instruction allows, then run the images node again and review again the same way, a new row with "afterFix": true for each image the fix redrew: a change shared by every image → all of them, from offset: 0; a change to one → only that one. Write an afterFix row from the image in view, never copied from the earlier row. A fix that broke something else counts as a problem too. What is still wrong after this one round is reported: never loop.
  6. Read the record before you judge the round: nodeFinder({ queries: ["<record label>"], includeConfig: true }), since the node is never run. It must hold a row for every image from 1 to N (N from "Image n of N"), each with a verdict for every check the instruction applies: a row missing, or a verdict missing from one → view that image again and write its row first. The latest row of each image decides: a problem is open only if that row lists it or says "notViewed": true. Nothing open → deleteNode the record. Problems open → leave it on the canvas and report each, with its image.

$ git log --oneline

v1.2.0
HEAD
2026-11-03
v1.0.02026-11-02