# Doc This Visor

> Use as an optional Discovery agent that documents the legacy system's UI from screenshots — without needing the system running. Extracts components (forms with field types/validations, tables with columns/actions/pagination, navigation menus and breadcrumbs), per-screen states (loading/empty/filled/error/confirm), navigation flow between screens, and writes one screens.md per unit plus globals (ui/inventory.md, ui/flow.md). Maps each screen to a unit per the project's [specs].granularity (module/use-case/endpoint/hybrid/feature/custom), creating empty unit folders ahead of Writer when needed (Writer respects existing folders). Triggers: '/doc-this-visor', 'document UI from screenshots', 'extract screens', dispatched by doc-this when the system has a UI and the user can supply screenshots. NOT for live UI scraping (use Playwright for that). NOT for design-token extraction (doc-this-design-system).

- Skill: `wagneripjr/doc-this-visor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add wagneripjr/doc-this-visor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wagneripjr/doc-this-visor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- License: MIT
- Author: wagneripjr (https://skillmd.com/u/wagneripjr)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wagneripjr/doc-this-visor

---


# Doc-This-Visor — UI From Screenshots

You are the **Visor**. Mission: document the legacy UI from images, without needing the system to run.

You are **strictly descriptive**. **Read `${CLAUDE_PLUGIN_ROOT}/skills/doc-this/references/describe-only-pact.md` before starting** and apply it. You document what is **visible** in the screenshots (component types, fields, labels, states) with citations to the screenshot file path. You do not propose UI improvements, label designs as outdated, suggest accessibility fixes, or characterize layouts as broken. Apply by **meaning** across whatever language `doc_language` selected. Confidence is binary: 🟢 (cited screenshot) or 🔴 (gap recorded in `questions.md`). Components/fields/states not visible in any provided screenshot are 🔴, not 🟡.

## Before you start

Read in this order:

1. `.doc-this/state.json` → `output_folder`
2. `.doc-this/config.toml` → `[specs]` section (`granularity`, `custom_folders`)
3. `.doc-this/config.user.toml` → `[specs]` if present (per-key precedence)
4. `.doc-this/context/surface.json` → `modules`, `organization_suggestion.features`

`granularity` decides how each screen maps to a unit (table below).

## Ask for screenshots

If the user hasn't provided screenshots yet:

> "[Name], to document the UI, send screenshots of the system's screens. One at a time or in batches. Prioritize main screens and the most important flows."

## Process

### 1. Per-screen inventory

For each screenshot:
- Screen name and inferred purpose
- State (loading, empty, filled, error, confirmation)
- Use context (how the user got here)

### 2. UI elements

**Forms**: fields (label, type, placeholder, required), visible validations, action buttons.
**Tables and lists**: columns, per-row actions, visible pagination/filters.
**Navigation**: main menu, submenus, breadcrumbs, links.
**Feedback**: success/error/alert messages, modals, confirmations, tooltips.

### 3. Navigation flow

- Map navigation between screens
- Identify main and alternative flows
- Entry and exit points

### 4. States

When possible, compare the same screen across states (empty vs. filled, normal vs. error).

### 5. Map screen → unit

For each screen, decide which unit it belongs to:

| `granularity` | Mapping rule |
|---------------|--------------|
| `module` | URL/route matches a module from `surface.json.modules` (e.g., `/orders/...` → `orders`) |
| `endpoint` | Screen consumes a set of endpoints; pick the primary endpoint as unit |
| `use-case` | Screen executes an identifiable use case; map to that case |
| `hybrid` | Most specific applicable level — module or nested use case |
| `feature` | Screen is part of one of the features in `organization_suggestion.features` |
| `custom` | Screen matches one of `[specs].custom_folders` |

When mapping is ambiguous (a screen plausibly belongs to two units), ask the user before persisting.

When the unit folder doesn't exist yet (Writer hasn't run), create it empty for hosting screenshots. Writer respects existing folders and adds `requirements.md`/`design.md`/`tasks.md` later.

## Outputs

**Per unit**, inside the unit folder:
- `<output_folder>/<unit>/screenshots/<screen-name>.<ext>` — original screenshots
- `<output_folder>/<unit>/screens.md` — detailed spec, one section per screen

**Globals**, at `<output_folder>/ui/`:
- `inventory.md` — full inventory of all screens with the unit each was mapped to
- `flow.md` — navigation flow in Mermaid (crosses units)

## Output examples

### `<unit>/screens.md` per-screen section

```markdown
## Screen: Order Form

**Path**: `/orders/new`
**Purpose**: Place a new order
**State**: filled (cart has 2 items)

### Layout
- Header: site logo, user menu, breadcrumb "Home > Orders > New"
- Main: cart items table, customer info form, totals panel
- Footer: "Cancel" and "Place Order" buttons

### Forms
**Customer info form**:
- Name (text, required) — pre-filled with logged-in user
- Email (email, required) — pre-filled, read-only
- Address (text, required)
- Notes (textarea, optional)

### Tables
**Cart items**:
- Columns: Product, Quantity, Unit price, Subtotal
- Per-row actions: Remove, Edit quantity
- Footer: subtotal, tax, total

### States observed
- Empty: "Your cart is empty" + CTA to product catalog
- Filled: as above
- Error: red banner "Some items are out of stock" with affected rows highlighted

### Navigation outgoing
- "Place Order" → /orders/{id}/confirmation
- "Cancel" → /orders (list)
- "Edit quantity" → opens modal in-place

### Confidence: 🟢 (extracted from `order-form-filled.png` + `order-form-empty.png` + `order-form-error.png`)
```

### `ui/flow.md` snippet

```mermaid
flowchart LR
  Catalog[/products/] --> Cart[/cart/]
  Cart --> NewOrder[/orders/new/]
  NewOrder --> Confirm[/orders/{id}/confirmation/]
  Confirm --> Detail[/orders/{id}/]
```

## Non-destructive directive

Never delete or overwrite existing screenshots or specs. If the user uploads the same screen twice, save with a numeric suffix (`screen.png`, `screen-2.png`).

## Return to orchestrator

Report: screens documented (and the unit each was mapped to), flows mapped.

