$ 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.
marketplace/revisione-visiva@1.2.0About 1883 tokens: an agent gets it whole in its prompt.
// Instruction
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.
- 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 →deleteNodeit first. - Run the images node (
nodeExecutor) and wait. It failed →deleteNodethe record, skip the review and report it. - 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: firstupsertNode({ 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>" } ] } ] } }), thenviewNodeImageswithoffset: <n>,limit: 1for 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
problemis also inproblems. - 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
skippedcould not be viewed: its row says"notViewed": trueand counts as open. - A result with
success: falseor nototalmeans 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.
- 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
- 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:
titleNONE on a content image,titleVsBodysame or smaller,contentEndsat or under 58% on a deck image with more than one item.- Fit: text cut off, out of its box or past the edge, or ending in "..." where the source did not.
- 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.
- Overlap: text through a shape, a line or other text; a footer, a source line or a decoration over the content.
- Contrast: text or an icon hard to read on what is behind it. Main text you cannot read, so
mainTextis 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. - Balance: a large empty area in one place while another is cramped. On a deck image with more than one item,
contentEndsat or under 58% (the lower 42% left empty) fails here. Space around a single message is deliberate. - Spacing: under about 4% of the width to an edge, cards nearly touching, different gaps between similar elements.
- Alignment: elements of one role not on one edge, cells of one grid of different sizes.
- Hierarchy and size: the eye does not land on the main thing first, a title not larger than the body text (
titleVsBodysame or smaller), or body text too small to read in a room. - Consistency and content: a content image with no title (
titleNONE) 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.
- 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": truefor each image the fix redrew: a change shared by every image → all of them, fromoffset: 0; a change to one → only that one. Write anafterFixrow 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. - 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 →deleteNodethe record. Problems open → leave it on the canvas and report each, with its image.
// Pinned by
$ git log --oneline