# The blind visual-inventory protocol + audit schema

Companion artifact to curriculum module 05 (Multi-modal agents) at
https://lyceumagents.com/curriculum/multimodal-agents/

Two portable artifacts: the fixed prompt a blind observer runs against
any image, and the JSON schema an image-less auditor returns. Together
they split image evaluation into perception (blind) and judgment
(text-only) — usable with any vision model, no framework required.

The one law that makes both work: **the observer never learns what was
expected; the judge never sees the pixels.**

---

## 1. The inventory protocol (verbatim from inspectImageTool)

Send this with the image — and nothing else. No spec, no title, no hint
of intent:

```
You are a blind visual inventory agent. You know NOTHING about what this
image was supposed to be, who requested it, or why. Enumerate ONLY what
is actually present:

1. SUBJECTS — every distinct subject and object, with EXACT counts.
2. COMPOSITION — framing, perspective, and placement (foreground /
   midground / background).
3. LIGHT — direction, quality, and any notable lighting phenomena.
4. PALETTE — dominant colors and tonal range.
5. MEDIUM CUES — photographic, painterly, or rendered qualities; grain,
   texture, brushwork.
6. TEXT & ARTIFACTS — any lettering, watermarks, or generation artifacts.

RULES:
- Counts are exact numbers, never "several".
- ZERO quality judgments: no "beautiful", no "well-composed", no
  "striking".
- ZERO guesses about intent or purpose.
- If something is genuinely ambiguous, write "uncertain:" and describe
  what is visible.
Return a plain, factual, numbered inventory.
```

Known gap from the live run: the protocol doesn't report pixel
dimensions, so aspect-ratio fields audit as "unverifiable". If your
specs pin aspect ratio, add a line: `7. DIMENSIONS — report the image's
pixel dimensions and approximate aspect ratio.` Widen the witness;
never let the judge peek.

## 2. The audit schema (the judge's contract)

The auditor receives two texts — the approved spec and the inventory —
and returns:

```json
{
  "fields": [
    {
      "field": "spec field checked, e.g. subject_matter.primary_focus",
      "expected": "what the spec demands, briefly",
      "observed": "what the inventory reports, briefly",
      "verdict": "match | mismatch | unverifiable"
    }
  ],
  "conformance": 0,
  "recommendation": "accept — or: regenerate, naming the ONE spec field to reinforce"
}
```

Auditor rules (paste into its instruction):

- Judge CONFORMANCE, never beauty. "Is it good?" is not the question;
  "is it what was specified?" is.
- The inventory is the only source of observations. Silent field →
  "unverifiable", never a guess.
- Exact counts matter: three specified, two observed = mismatch.
- conformance = matching fields / checkable fields (0–100).
- One reinforcement per regeneration — the single field whose fix
  matters most. Shotgun re-specs teach you nothing about what worked.

## 3. Why the division holds (the checklist)

- [ ] The observer's interface accepts the image and NOTHING else —
      blindness enforced structurally, not by politeness.
- [ ] The judge's interface accepts text and NOTHING else.
- [ ] The orchestrator (or human) who approves the spec never scores
      the result — decisions, yes; grades, no.
- [ ] Every verdict traces to a quotable spec line and a quotable
      inventory line.
- [ ] Every "unverifiable" becomes a protocol improvement, not a pass.
