Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
aecb061
chore(git): ignore generated web artifacts
reiganarmstrong Sep 19, 2026
74e9b0d
chore(agents): configure repository workflows
reiganarmstrong Sep 19, 2026
21d5734
docs(evaluation): record domain and architecture decisions
reiganarmstrong Sep 19, 2026
fe861a6
docs(evaluation): add model evaluation specification
reiganarmstrong Sep 19, 2026
9cc5b95
docs(evaluation): add implementation ticket graph
reiganarmstrong Sep 19, 2026
c371979
feat(audit): add explicit request configuration
reiganarmstrong Sep 19, 2026
c395efa
style(audit): address review findings
reiganarmstrong Sep 19, 2026
aa77ee9
feat(evaluation): bootstrap private CLI workspace
reiganarmstrong Sep 19, 2026
b99017f
fix(evaluation): enforce private workspace safety
reiganarmstrong Sep 19, 2026
e9485bf
fix(evaluation): anchor private paths to worktree
reiganarmstrong Sep 19, 2026
e3de4fa
docs(agents): define ticket resolution convention
reiganarmstrong Sep 19, 2026
0bd719c
feat(evaluation): freeze immutable benchmark snapshot
reiganarmstrong Sep 19, 2026
fc630cb
fix(evaluation): harden snapshot publication
reiganarmstrong Sep 19, 2026
e4f9a55
docs(evaluation): resolve benchmark snapshot ticket
reiganarmstrong Sep 19, 2026
472500c
feat(evaluation): complete guarded model evaluation workflow
reiganarmstrong Sep 19, 2026
8bfe6af
fix(evaluation): enforce execution and review invariants
reiganarmstrong Sep 19, 2026
1cb479a
style(evaluation): wrap CLI fixture metadata
reiganarmstrong Sep 19, 2026
2129616
fix(evaluation): bind reports to verified run inputs
reiganarmstrong Sep 19, 2026
68d34d9
docs(evaluation): resolve framework implementation tickets
reiganarmstrong Sep 19, 2026
2448042
feat(evaluation): streamline run-oriented CLI workflow
reiganarmstrong Sep 19, 2026
6a1e6c0
fix(evaluation): bind execution to planned run destination
reiganarmstrong Sep 19, 2026
442c4cb
docs(evaluation): resolve run-oriented CLI workflow
reiganarmstrong Sep 19, 2026
210044c
fix(evaluation): map mandated workbook headers
reiganarmstrong Sep 20, 2026
0b9c3d2
refactor(evaluation): retire legacy audit runner
reiganarmstrong Sep 20, 2026
6ac3311
docs(evaluation): add implementation progress report
reiganarmstrong Sep 20, 2026
617a31f
feat(evaluation): removed temporal assumption metadata from evaluation
reiganarmstrong Sep 20, 2026
96c5a4f
feat(evaluation): retarget frozen audit to Haiku extended thinking
reiganarmstrong Sep 22, 2026
ffec10d
fix(evaluation): retain reported usage from interrupted streams
reiganarmstrong Sep 22, 2026
3e6e9d2
docs(evaluation): resolve Anthropic retarget spec after verification
reiganarmstrong Sep 22, 2026
7b99d16
refactor(evaluation): reduce homepage POC to run and report
reiganarmstrong Sep 23, 2026
b32eea1
fix(evaluation): close review gaps in guarded runs
reiganarmstrong Sep 23, 2026
5614390
docs(evaluation): resolve POC reduction spec
reiganarmstrong Sep 23, 2026
9285927
docs(evaluation): explain final report walkthrough
reiganarmstrong Sep 24, 2026
bf32ad9
docs(evaluation): make walkthrough work after workspace deletion
reiganarmstrong Sep 24, 2026
577a804
docs(evaluation): show run command without live execution
reiganarmstrong Sep 24, 2026
9d63037
refactor(evaluation)!: name raw and normalized findings explicitly
reiganarmstrong Sep 24, 2026
2fb478c
docs(evaluation): retain single-page limitation after rename
reiganarmstrong Sep 24, 2026
aad5204
docs(evaluation): make filling in review.csv more clear
reiganarmstrong Sep 24, 2026
28c8a86
feat(skills): add link to matt pocock skills for claude
reiganarmstrong Sep 27, 2026
9c014de
docs(evaluation): explain homepage run JSON files
reiganarmstrong Sep 27, 2026
d4a87cf
refactor(evaluation)!: name raw and normalized audit files explicitly
reiganarmstrong Sep 27, 2026
14c07a7
docs(scratch): resolve rename-audit-artifacts spec
reiganarmstrong Sep 27, 2026
25cd709
refactor(evaluation): rename pricing.v2.json to pricing.json
reiganarmstrong Sep 27, 2026
30ca95f
fix(evaluation): render original defect evidence verbatim in report.md
reiganarmstrong Sep 27, 2026
12c17ab
docs(evaluation): record plain-language report spec and tickets
reiganarmstrong Sep 29, 2026
401822c
refactor(evaluation)!: adopt Human audit and LLM vocabulary
reiganarmstrong Sep 29, 2026
61ac26c
chore(tickets): resolve Human audit vocabulary ticket
reiganarmstrong Sep 29, 2026
be15c06
feat(evaluation)!: explain catches and misses in plain language
reiganarmstrong Sep 29, 2026
bffab02
chore(tickets): resolve plain-language report ticket
reiganarmstrong Sep 29, 2026
e77b2c0
chore(evaluation): record reviewed live verification
reiganarmstrong Sep 29, 2026
2fb259a
chore(tracker): resolve live verification ticket
reiganarmstrong Sep 29, 2026
b8e3a36
fix(evaluation): clarify report checks and format explanation bullets
reiganarmstrong Oct 1, 2026
1bc12d9
feat(evaluation)!: organize supporting run artifacts
reiganarmstrong Oct 1, 2026
49b50c5
docs(tracker): resolve run directory layout spec
reiganarmstrong Oct 1, 2026
bd1d9f6
feat(evaluation): select Haiku, Opus, or Sonnet presets
reiganarmstrong Oct 1, 2026
896cceb
fix(evaluation): explain presets and cost limit in CLI help
reiganarmstrong Oct 1, 2026
5994cda
docs(evaluation): resolve model selection spec after review
reiganarmstrong Oct 1, 2026
f9e2186
fix(evaluation): use medium effort for Opus and Sonnet
reiganarmstrong Oct 1, 2026
d61ed55
docs(evaluation): record medium effort verification
reiganarmstrong Oct 1, 2026
605a694
tests: consolidate evaluator suite and make scratch tracker local
reiganarmstrong Oct 1, 2026
ce345d1
tests: cover declined approval and excluded-row claims after review
reiganarmstrong Oct 1, 2026
b93586d
fix(evaluation): parse LLM responses exactly as the API does
reiganarmstrong Oct 1, 2026
ab42455
fix(evaluation): catch exactly the parse errors the API skips
reiganarmstrong Oct 1, 2026
77c791b
fix(evaluation): count LLM findings with the tool's per-check rules
reiganarmstrong Oct 1, 2026
8a59f67
fix(evaluation): keep table evidence intact and reject text issue lists
reiganarmstrong Oct 1, 2026
eabee40
docs(readme): add review prompt and move evaluator section to end
reiganarmstrong Oct 1, 2026
b219345
docs(readme): clarify evaluator response handling
reiganarmstrong Oct 3, 2026
b83a09b
chore(readme): wording and formatting
reiganarmstrong Oct 3, 2026
9789af8
fix(llm-client): honor explicit OpenAI retry policy
reiganarmstrong Oct 9, 2026
9689932
feat(llm-client): integrate explicit OpenAI retry policy
reiganarmstrong Oct 9, 2026
4a9065d
feat(evaluation): add GPT and Haiku model presets
reiganarmstrong Oct 9, 2026
f396b45
feat(evaluation): integrate GPT and Haiku model presets
reiganarmstrong Oct 9, 2026
fa79408
feat(evaluation): estimate costs per request and context tier
reiganarmstrong Oct 9, 2026
b33251c
feat(evaluation): integrate request and context tier pricing
reiganarmstrong Oct 9, 2026
8fd8e3f
refactor(evaluation): centralize OpenAI preset membership
reiganarmstrong Oct 9, 2026
5c03c52
refactor(evaluation): integrate model support review fixes
reiganarmstrong Oct 9, 2026
a9c73b9
feat(evaluation): default to Haiku 5.5 and remove Haiku 4.5
reiganarmstrong Oct 10, 2026
9836f03
docs(evaluation): record full evaluation domain and scoring rules
reiganarmstrong Oct 10, 2026
ddd3b1d
refactor(evaluation): share page preparation and reviewed reports
reiganarmstrong Oct 10, 2026
d1deb2d
feat(evaluation): capture listed Benchmark snapshots
reiganarmstrong Oct 10, 2026
7d7da8d
Merge ticket 01: shared human-audit page evaluation
reiganarmstrong Oct 10, 2026
8f7948a
Merge ticket 02: persistent full-evaluation snapshot capture
reiganarmstrong Oct 10, 2026
c870fc3
feat(evaluation): preview all Human audit pages from saved snapshots
reiganarmstrong Oct 10, 2026
54c7022
Merge ticket 03: deterministic full-evaluation preview
reiganarmstrong Oct 10, 2026
e8429a5
feat(evaluation): execute all pages with one cost allowance
reiganarmstrong Oct 10, 2026
9bbd095
Merge ticket 04: approved execution with shared cost allowance
reiganarmstrong Oct 10, 2026
49fdc4b
test(evaluation): isolate missing provider credentials from dotenv
reiganarmstrong Oct 10, 2026
3de396a
Merge credential-test isolation from local dotenv configuration
reiganarmstrong Oct 10, 2026
3c3000e
feat(evaluation): report combined detection for every listed page
reiganarmstrong Oct 10, 2026
a180a18
Merge ticket 05: combined detection reporting for all evaluated pages
reiganarmstrong Oct 11, 2026
51378c5
refactor(evaluation): address full evaluation review findings
reiganarmstrong Oct 11, 2026
e298869
Merge final full-evaluation review fixes
reiganarmstrong Oct 11, 2026
3e262ac
chore(evaluator): add Ruff and fix lint issues
reiganarmstrong Oct 15, 2026
83af377
feat(evaluator): generate standalone single-page HTML reports
reiganarmstrong Oct 15, 2026
d163391
docs(evaluator): record installed axe-core version
reiganarmstrong Oct 15, 2026
f04897d
Merge single-page HTML evaluation reports
reiganarmstrong Oct 15, 2026
b0204c4
feat(evaluator): generate standalone Full HTML reports
reiganarmstrong Oct 15, 2026
43a672a
docs(evaluator): record complete Full report evidence check
reiganarmstrong Oct 15, 2026
6a14c8c
Merge self-contained Full evaluation HTML reports
reiganarmstrong Oct 15, 2026
5305e2c
feat(evaluator): visualize detection rates in offline reports
reiganarmstrong Oct 15, 2026
1e54ad0
Merge detection performance charts
reiganarmstrong Oct 15, 2026
c95b1f9
feat(evaluator): search and filter embedded matching evidence
reiganarmstrong Oct 15, 2026
7300deb
Merge branch 'feat/html-evaluation-reports' into feat/html-report-04
reiganarmstrong Oct 15, 2026
1b09dc6
docs(evaluator): record offline filtering verification
reiganarmstrong Oct 15, 2026
36d7ec7
Merge report evidence search and filters
reiganarmstrong Oct 15, 2026
7bb039b
feat(evaluator): print complete offline evaluation reports
reiganarmstrong Oct 15, 2026
deeedf0
Merge complete report printing
reiganarmstrong Oct 15, 2026
37db71d
refactor(evaluator): share HTML report document layout
reiganarmstrong Oct 15, 2026
f28dea1
Merge shared report layout review fix
reiganarmstrong Oct 15, 2026
c66778e
refactor(evaluator): suffix report templates with .jinja
reiganarmstrong Oct 15, 2026
d5c2900
refactor(evaluator): separate static report assets from templates
reiganarmstrong Oct 15, 2026
d3b7b6a
docs: define self-contained evaluation reports
reiganarmstrong Oct 15, 2026
7ae314e
feat(reports): clarify findings and highlight cost and detection
reiganarmstrong Oct 15, 2026
b77bd94
feat(reports): simplified wording for llm detection rates for each pa…
reiganarmstrong Oct 15, 2026
7de54ab
feat(reports): simplify filters and explain overall counts
reiganarmstrong Oct 15, 2026
c5ece05
feat(reports): connect findings filters and table across screen sizes
reiganarmstrong Oct 15, 2026
53269d2
feat(reports): improve accessibility and simplify report output
reiganarmstrong Oct 15, 2026
eb5aca1
fix(reports): hide unmatched evidence fields and redundant text
reiganarmstrong Oct 16, 2026
62fc97c
chore(lint): fix Ruff findings across the repository
reiganarmstrong Oct 16, 2026
a9d650d
refactor(evaluation): group supporting modules by responsibility
reiganarmstrong Oct 16, 2026
ba420df
fix(evaluation): type homepage scope set for literal narrowing
reiganarmstrong Oct 16, 2026
af175b7
refactor: remove unused helpers, metadata, and arguments
reiganarmstrong Oct 16, 2026
584f5a1
docs(evaluation): record shared Human audit decisions
reiganarmstrong Oct 22, 2026
5a229ad
feat(evaluation): enforce approved single-page audit decisions
reiganarmstrong Oct 22, 2026
b7104f8
Merge branch 'feat/evaluation-baseline' into feat/baseline-single-page
reiganarmstrong Oct 22, 2026
0cfcf28
Merge ticket 02 baseline single-page workflow
reiganarmstrong Oct 22, 2026
982e38d
feat(evaluation): approve decisions for all original Human findings
reiganarmstrong Oct 22, 2026
8a07be4
Merge ticket 04 approved Human audit decisions
reiganarmstrong Oct 22, 2026
6ee14c9
feat(evaluation): enforce shared decisions across full runs
reiganarmstrong Oct 22, 2026
03719da
Merge branch 'feat/evaluation-baseline' into feat/baseline-full-evalu…
reiganarmstrong Oct 22, 2026
0104744
Merge ticket 03 shared-baseline full evaluation
reiganarmstrong Oct 22, 2026
742fe57
docs(evaluation): explain corrected saved-run detection counts
reiganarmstrong Oct 22, 2026
75b8652
feat(evaluation): correct saved full runs with verified backups
reiganarmstrong Oct 22, 2026
18b0cdd
Merge branch 'feat/evaluation-baseline' into feat/baseline-saved-corr…
reiganarmstrong Oct 22, 2026
7b46464
Merge ticket 05 saved evaluation correction
reiganarmstrong Oct 22, 2026
433c385
refactor(evaluation): share saved baseline integrity checks
reiganarmstrong Oct 22, 2026
7480840
Merge final evaluation baseline review fixes
reiganarmstrong Oct 22, 2026
b6fca0c
feat(evaluation): author required baselines through CSV review
reiganarmstrong Oct 22, 2026
9d722b8
chore(evaluation): keep approved baseline data local
reiganarmstrong Oct 22, 2026
3ce5a20
docs: remove evaluation records and untrack skill support docs
reiganarmstrong Oct 24, 2026
bb162cc
test(evaluation): prune suite to core regression contracts
reiganarmstrong Oct 24, 2026
0579243
refactor(evaluation): rename baseline to human finding mapping
reiganarmstrong Oct 24, 2026
1fba5d8
chore(gitignore): clean up uneeded documents from branch
reiganarmstrong Oct 24, 2026
31fe256
fix(llm): restore prompt element type metadata
reiganarmstrong Oct 24, 2026
97dc8e5
fix(api): restore existing exception handling
reiganarmstrong Oct 24, 2026
182517a
chore: ignore local CONTEXT.md files
reiganarmstrong Oct 24, 2026
6645f8e
refactor(evaluation): rename baseline modules to human finding mapping
reiganarmstrong Oct 24, 2026
b4c99e8
refactor(evaluation)!: remove baseline compatibility and legacy tests
reiganarmstrong Oct 24, 2026
2eca2ec
feat(evaluation): simplify generated review directories
reiganarmstrong Oct 25, 2026
829bd9d
docs(evaluation): streamline setup and clarify audit terminology
reiganarmstrong Oct 25, 2026
1407162
chore(readme): fix wording
reiganarmstrong Oct 25, 2026
8b17668
chore(evaluation): remove compatibility entry point and fix wording
reiganarmstrong Oct 25, 2026
ff3e382
Undo a lot of purely stylistic changes
mrysav Oct 29, 2026
fcd4a21
chore(evaluation): remove linting and changes unrelated to the evaluator
reiganarmstrong Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ jobs:
print('all entry points import cleanly')
"

- name: Network-free test suite
run: uv run pytest -q

# Exercises extractors, slicers, prompt templates and the programmatic
# checkers end to end. --dry-run makes no API calls, so this needs no key
# and costs nothing.
Expand Down
22 changes: 22 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -212,5 +212,27 @@ output/
# CI smoke-test output
ci-output/

# Private model-evaluation inputs and derived artifacts
/Pristine Accessibility Defect Report.xlsx
/.model-evaluation/
/vision_aid/evaluation/human_finding_mappings/

# Node.js / Next.js generated files
node_modules/
.next/
next-env.d.ts
*.tsbuildinfo
web/prisma/generated/

# Stray git worktrees — never belong in the index
.claude/worktrees/

# Local-only issue tracker and detailed evaluator tests
/.scratch/
/.local-tests/

# Local architecture decision records
/docs/adr/

# Local agent context
CONTEXT.md
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"python.terminal.useEnvFile": true
}
13 changes: 13 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Agent skills

### Issue tracker

Issues are tracked as local Markdown files under `.scratch/`. See `docs/agents/issue-tracker.md`.

### Triage labels

The default five-role triage vocabulary is used. See `docs/agents/triage-labels.md`.

### Domain docs

This repository uses a single-context domain-doc layout. See `docs/agents/domain.md`.
15 changes: 15 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
This project builds LLM-powered tools that analyze websites for WCAG accessibility issues and generate structured remediation reports. It is a Computing for Good course project at Georgia Tech (OMSCS) partnered with the Vision Aid Digital Accessibility Testing Team.

The system has three planned stages:

1. Automated webpage accessibility analysis → structured CSV reports
2. Code remediation suggestions based on those reports
3. (Stretch) Chrome extension for on-the-fly accessibility fixes
Expand Down Expand Up @@ -116,3 +117,17 @@ Docker image → GHCR (`ghcr.io/c4g/va-dat`) → Coolify at `https://va-dat.c4g.
- HTML test files can be enormous (500K+ tokens) — do not read them fully into context.
- Some files may have non-UTF-8 encoding; always use `errors='replace'`.
- Model defaults differ by entry point: `run_pipeline.py` uses `claude-sonnet-5`, `api_server.py` uses `claude-haiku-4-5-20251001`.

## Agent skills

### Issue tracker

Issues are tracked as local Markdown files under `.scratch/`. See `docs/agents/issue-tracker.md`.

### Triage labels

The default five-role triage vocabulary is used. See `docs/agents/triage-labels.md`.

### Domain docs

This repository uses a single-context domain-doc layout. See `docs/agents/domain.md`.
181 changes: 173 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,9 @@ HTML file (e.g. 1.9 MB)
│ │ ├── forms_checklist_02.txt # 6 prompts for form accessibility
│ │ └── nontext_checklist_03.txt # 8 prompts for non-text content
│ │
│ ├── llm_client/ # Standalone Claude API client (Andrew)
│ │ ├── client.py # API wrapper
│ │ ├── prompt_loader.py # Prompt loading utilities
│ │ └── runner.py # End-to-end audit runner
│ ├── llm_client/ # Provider-independent audit requests
│ │ ├── audit.py # API requests and response metadata
│ │ └── client.py # Model-provider capability helpers
│ │
│ ├── llm_preprocessing/ # HTML → structured JSON extractors
│ │ ├── semantic_checklist_01.py # Headings, links, landmarks, tables, iframes
Expand All @@ -74,9 +73,29 @@ HTML file (e.g. 1.9 MB)
│ │
│ └── docs/pipeline.md # Pipeline architecture documentation
│
├── vision_aid/ingestion/
│ ├── file_crawler.py # fetch_page / fetch_pages_nested (used by the server)
│ └── pull_html.py # Standalone HTML download helper
├── vision_aid/
│ ├── evaluation/ # Evaluation workflows, review, and shared schemas
│ │ ├── README.md # Detailed evaluator guide and command reference
│ │ ├── cli.py # CLI commands and operator interaction
│ │ ├── full.py # Full evaluation across all audited pages
│ │ ├── page.py # Shared page preparation and review validation
│ │ ├── review.py # Review CSV validation and detection counts
│ │ ├── schemas.py # Shared Human audit and finding types
│ │ ├── inputs/
│ │ │ └── human_audit.py # Import Human findings and audited URLs
│ │ ├── execution/
│ │ │ ├── llm_audit.py # LLM requests, saved responses, and cost guardrails
│ │ │ ├── normalization.py # Convert tool responses into findings
│ │ │ ├── pricing.py # Load price schedules and estimate request cost
│ │ │ └── pricing.json # Versioned public model rates
│ │ └── reporting/
│ │ ├── html_report.py # Prepare report data and render standalone HTML
│ │ ├── templates/ # Report HTML templates
│ │ ├── css/ # Report styles
│ │ └── js/ # Report filters and printing
│ └── ingestion/
│ ├── file_crawler.py # fetch_page / fetch_pages_nested (used by the server)
│ └── pull_html.py # Standalone HTML download helper
│
├── Dockerfile # Multi-stage uv build → runtime image
├── docker-compose.yml # Local run (Coolify deploys the image directly)
Expand All @@ -100,7 +119,7 @@ HTML file (e.g. 1.9 MB)
├── docs/ # Architecture documentation
│ └── modular-prompts-plan.md # Full architectural plan
│
├── reports/ # Raw JSON output from standalone llm_client runs
├── reports/ # Historical raw JSON audit output
│
├── test_results/
│ ├── chatgpt/ # Legacy ChatGPT testing results
Expand Down Expand Up @@ -276,10 +295,16 @@ everything it does is free:

- `uv.lock` is in sync with `pyproject.toml`, and `requirements.txt` matches the lock
- entry points import
- the tracked synthetic pytest suite (`uv run pytest -q`), with no private data or provider calls
- a full pipeline dry run, asserting prompts generated, findings found, and zero tokens consumed
- `index.html`'s inline JavaScript parses
- the Docker image builds, becomes healthy, serves the site, and returns a valid NDJSON audit

Default pytest discovery is limited to `tests/`, where `tests/test_evaluation.py`
covers the evaluator end to end through its CLI with a fake provider. Optional
detailed evaluator cases live in the ignored `.local-tests/evaluation/` folder;
run them with `uv run pytest -q .local-tests/evaluation`. CI never needs them.

## Running the Pipeline

### Dry run (no API calls, no cost)
Expand Down Expand Up @@ -384,3 +409,143 @@ The pipeline skips prompts with empty payloads (e.g., no forms on the page = no
| Andrew Yin | CL02 + CL03 extractors, CL02 + CL03 prompts, LLM client, pipeline docs | `processing_scripts/llm_preprocessing/`, `processing_scripts/llm_client/`, `processing_scripts/llm/*.txt` |
| nfulton99 | HTML ingestion, packaging | `vision_aid/ingestion/pull_html.py`, `pyproject.toml` |
| ColeANiblett | Pipeline orchestration, prompt system, report generator | `processing_scripts/llm/{registry,slicers,templates}.py`, `entry_points/`, `docs/` |

## Model evaluation

The evaluator measures how many findings from an existing human accessibility
audit va-dat catches. It runs programmatic checks and one selected LLM against
saved page HTML, then uses reviewed matches to produce an offline HTML report
with LLM, Programmatic, and Overall detection rates.

There are two reviews: approve the audit's classifications and programmatic
matches once, then review LLM matches after each model run. The evaluator
validates the saved evidence and calculates scores; the reviewer decides
whether findings describe the same defect.

The [evaluator guide](vision_aid/evaluation/README.md) covers input formats,
matching rules, scoring, model settings, saved files, and troubleshooting.

### Evaluator quick start

Complete [setup](#setup) first.

**Run all commands in this guide from the repository root**, the va-dat/ directory containing pyproject.toml and the root README.
All relative paths in the examples are relative to that directory.

The human audit Excel file, `Pristine Accessibility Defect Report.xlsx`,
belongs directly in the repository root, alongside this README. The examples
expect it at `./Pristine Accessibility Defect Report.xlsx`. The file and
approved mappings are private local inputs, excluded from Git. If the file
is missing, obtain it from your project team and place it there, or supply your
own audit in the [supported format](vision_aid/evaluation/README.md#human-audit-excel-file-format)
and update `AUDIT` below.

This walkthrough evaluates every URL listed in the audit. Keep the same saved
HTML when comparing models. If you already have snapshots and an approved
mapping for this audit, set their paths below and skip steps 1 and 2.

```bash
AUDIT='./Pristine Accessibility Defect Report.xlsx'
SNAPSHOTS='.model-evaluation/pristine-snapshots/snapshots.json'
REVIEW_DIR='.model-evaluation/pristine-mapping-review'
MAPPING="$REVIEW_DIR/human-finding-mapping.json"
MODEL='claude-haiku-5-5'
MAX_COST_USD=5.00 # Choose your total allowance for all pages.
```

1. **Capture the pages.** The output directory must be new. Capture downloads
server HTML without rendering JavaScript; inspect the saved pages before review.
It requires no model API key.

```bash
uv run visionaid-evaluate capture \
--human-audit "$AUDIT" \
--output-dir .model-evaluation/pristine-snapshots
```

2. **Prepare and approve the reusable mapping.** This makes no model requests.
The review directory must be new.

```bash
uv run visionaid-evaluate human-finding-mapping-prepare \
--human-audit "$AUDIT" --snapshots "$SNAPSHOTS" \
--output-dir "$REVIEW_DIR"
```

Follow the generated README: fill `classifications.csv` and
`programmatic-review.csv`, using `programmatic-findings.csv` as the checker
catalog. The [mapping review guide](vision_aid/evaluation/README.md#approve-a-human-finding-mapping)
explains the classification values and complete-match requirements. Then approve:

```bash
uv run visionaid-evaluate human-finding-mapping-approve \
--human-audit "$AUDIT" --snapshots "$SNAPSHOTS" \
--review-dir "$REVIEW_DIR" --reviewer "Your name and review method"
```

3. **Preview the evaluation.** Inspect the pages, prompt count, model settings,
and prices without an API key or paid requests. A preview cannot produce a
final report.

```bash
uv run visionaid-evaluate run-all \
--human-audit "$AUDIT" --snapshots "$SNAPSHOTS" \
--human-finding-mapping "$MAPPING" \
--model "$MODEL" --max-cost-usd "$MAX_COST_USD"
```

4. **Run the model.** Put `ANTHROPIC_API_KEY` for Claude or `OPENAI_API_KEY` for
GPT in your environment or the repository-root `.env`. Only the selected
provider's key is required. Repeat the command with `--live`:

```bash
uv run visionaid-evaluate run-all \
--human-audit "$AUDIT" --snapshots "$SNAPSHOTS" \
--human-finding-mapping "$MAPPING" \
--model "$MODEL" --max-cost-usd "$MAX_COST_USD" --live
```

Type `yes` when prompted. The allowance is checked between requests; a request
underway can exceed it. This creates a fresh run instead of executing the
preview directory. Requests run sequentially without retries. Restarting after
failure repeats all requests, including previously completed pages.

5. **Review the LLM matches.** Use the new directory printed by the live command:

```bash
RUN_DIR='.model-evaluation/full-runs/<live-run-id>'
```

Confirm `"complete": true` in `full.json`, and check each child's `run.json`
for `format_failures`. Follow each page's README under `$RUN_DIR/pages/`.
Compare `normalized-llm-findings.json`, `review.csv`, and `snapshot.html`.
Edit only `llm_finding_id`, `match_reason`, and `review_notes`. Leave an LLM ID
blank for a miss; record IDs only when they fully cover the human finding.
Keep approved classification and programmatic fields unchanged.
See the [matching rules](vision_aid/evaluation/README.md#review-llm-matches).

6. **Generate the reports.** After saving every page's review CSV:

```bash
uv run visionaid-evaluate report-all \
--run-dir "$RUN_DIR" --reviewer "Your name and review method"
```

Open `$RUN_DIR/report.html` for combined results. Each page also gets a
`report.html`. Reports work offline and can regenerate without model calls.

Choose `claude-haiku-5-5`, `claude-opus-5-5`, `claude-sonnet-5-5`,
`gpt-6-luna`, or `gpt-6.1-sol` as `MODEL`. Haiku is the default when `--model`
is omitted. Each run uses one model; compare models with separate runs using
the same audit, snapshots, and mapping.

To evaluate just one page, use `run` with `--html` and `--source-url`, then
`report`. See the [single-page commands](vision_aid/evaluation/README.md#evaluate-one-page).
For command options, use `uv run visionaid-evaluate --help` or add `--help`
after a command name.

The rates measure coverage of the supplied human audit. Findings that cannot
be tested from saved HTML remain in Overall, so perfect coverage of testable
findings can still produce an Overall rate below 100%. Read the
[scoring guide](vision_aid/evaluation/README.md#how-scoring-works) before interpreting
or comparing results.
Loading
Loading