Skip to content

Development

Mark Rogers edited this page Oct 27, 2026 · 4 revisions

How the repository is laid out, how it is checked, and how a release is made. The rules for anyone (person or agent) changing it are in AGENTS.md.

Layout

Path Holds
skills/artwright/ the hub skill, scripts/aw.py with scripts/aw_measure.py (the light, colour and composition measures it imports, 0.2.0) and scripts/aw_geom.py (the render, sprite and series gates, 0.4.0), and the knowledge files in references/ (movements, theory, traditions, evidence, craft, ceramics, market, law, the CLI list, and sprite-json.md, the render folder contract for geomgate)
skills/artwright-judge/ the judge skill; references/ holds the rubric, the verdict contract, vocabulary, the "AI look" and model profiles
skills/artwright-pixel/ the pixel skill; references/ holds pixel-art rules and sprites and tiles
skills/artwright-curate/ the curator skill; references/store.md gives the store layout and record formats
tests/ test_aw.py (offline tests for aw.py) and check_skills.py (structure and safety checks)
scripts/ budget.py (size budget) and eval-wsl.sh (runs the eval cases under WSL2, Linux or macOS)
evals/ evals.json and the eval cases; fixtures/make_fixtures.py draws the test images
.claude-plugin/ plugin.json (the manifest, version 0.7.2) and marketplace.json
ai-docs/ session notes, decisions, research and the handoff for the next session
root the shared evergreen record: evergreen.json, RESEARCH, CHANGELOG, LEARNINGS, TESTS, MAINTENANCE

Checks

From the repository root:

python tests/check_skills.py
python tests/test_aw.py
python scripts/budget.py

On the 0.7.2 source before release (Windows, Python 3.14.6, Pillow 12.3.0), tests ran 87 cases with one museum-network skip and zero failures. Skill checks passed; aw.py remains 86 KB (yellow). The earlier v0.7.1 run at 5d0a14e printed, in part:

Ran 86 tests in 14.702s

OK (skipped=1)
check_skills: 0 problem(s)
install size                   393 KB         green
aw.py                          86 KB          yellow
aw_measure.py                  39 KB          green
aw_geom.py                     36 KB          green
knowledge files                192 KB         green
vocabulary.md                  38153 bytes    green
descriptions (every session)   ~596 tokens    green

The same 86 tests passed on Linux (WSL2, Python 3.14.4, Pillow 13.0.0), one skipped.

The skipped test checks the museum fixtures: Cleveland Museum of Art open-access images fetched by accession number and compared against pinned SHA-256 values. It runs with AW_NET=1 python tests/test_aw.py, and was not run for this wiki.

check_skills.py checks the skills' structure, links, knowledge verified flags, LF line endings, and that no key or machine path is committed. budget.py keeps the install size, aw.py, aw_measure.py and aw_geom.py (each yellow from 60 KB, red over 100 KB), the knowledge files, vocabulary.md (red above 40 KB) and the always-loaded descriptions within budget.

Rules for aw.py

From AGENTS.md: standard-library Python 3.9 or later with Pillow optional, exactly one JSON object per command, failing soft with ok: false and error, on Windows, macOS and Linux. Never numpy, scipy, OpenCV, scikit-image or imagehash. Every new command or option gets an offline test with its fixture drawn in code, and aw.py, aw_measure.py and aw_geom.py each stay under 100 KB: when one nears the line, split or cut, never squeeze comments. No images are committed except the README banner.

CI

.github/workflows/tests.yml runs on pushes to main and on pull requests: Linux, macOS and Windows, with Python 3.9 and 3.14 (the Linux 3.9 job on ubuntu-24.04). Each job runs check_skills.py, test_aw.py without Pillow, test_aw.py again with Pillow on 3.14, and budget.py.

Evals

The skills are tested with claude plugin eval: trigger prompts and decoys (does the right skill fire, and does it stay quiet on a neighbour's request), action cases proven by evidence outside the transcript, and outcome and guard cases graded by a judge. scripts/eval-wsl.sh runs them, because native Windows has no sandbox for cases that grant Bash. Results go to evals/results/ and evals/cases/results/, both ignored by git. The runs so far are in TESTS.md.

Releases

Six so far: 0.3.0 (2026-10-23), 0.4.0 and 0.4.2 (2026-10-24), 0.7.0 and 0.7.1 and 0.7.2 (2026-10-26). .github/workflows/release.yml runs when a v* tag is pushed: it fails unless the tag matches the version in .claude-plugin/plugin.json, runs check_skills.py and budget.py, zips skills/ with the README, LICENSE and SECURITY.md as artwright-<version>.zip, and publishes a GitHub release with generated notes. Tags are made by the maintainer. The CHANGELOG's Releases list says which versions were tagged; its earlier mistakes about 0.7.1 and 0.4.0 were corrected in PR #24. 0.1.0, 0.1.1, 0.2.0, 0.4.1, 0.5.0 and 0.6.0 were never tagged. When a packaged file changes, the manifest version and the CHANGELOG's release notes move with it, and a breaking change to the verdict contract bumps the minor version.

The examples on this wiki

Each output on these pages was printed by a script that draws its test images in code, copies aw.py, aw_measure.py and aw_geom.py from the v0.7.2 tag archive into a scratch folder, and runs every page's command and Python block there; the output was pasted, not typed. It ran on 2026-10-26: Linux (WSL2) with Python 3.14.4 and Pillow 13.0.0 (the pages show this run), Linux with Pillow hidden, and Windows with Python 3.14.6 with and without Pillow, using ffmpeg 9.0.1 for fallback decoding. For Versions and upgrading the earlier script ran against the v0.4.2 tag, and the first wiki's script against 0.1.0 (997f5b9). The script and its saved outputs are kept in the maintainer's private notes, since they print the masked home folder; the repository's ai-docs/notes/2026-10-22-github-wiki.md says how to rerun them. Home folders are shown as /home/you and times as <time>.

Clone this wiki locally