Repository navigation
The Skills
polywright is seven agent skills that share one command-line tool. An agent loads a skill when a request matches its description; each description names the requests it owns and the sibling that owns nearby ones. This page says what each skill does, what it decides, and how often its description fired in tests.
| Skill | Owns | Typical request |
|---|---|---|
polywright |
The brief, the route (find, capture, generate, code), the asset folder and its manifest, the inspect, render and check loop | "I need a 3D model of a medieval well for my Unity game, and a print of it" |
polywright-references |
Which reference images, views and textures to gather or generate before modelling | "Make front, side and back views of a lantern so I can model it" |
polywright-capture |
Real places from OpenStreetMap and public elevation, photogrammetry, Gaussian splats, scanners, modelling from measurements | "Put the real park at the end of my street into a game level" |
polywright-generate |
Imagined models from a prompt, a drawing or photos: image-to-3D on ComfyUI or hosted, or code (bpy, build123d, CadQuery, OpenSCAD) | "Turn this concept art of a sci-fi crate into a 3D model" |
polywright-blender |
Blender scripts run headless, the Blender 5.x API traps, ten tested recipes, Blender MCP servers | "My Blender script says module bpy.ops.import_scene has no attribute obj" |
polywright-finish |
Making a mesh fit a game engine, the web or AR: triangles, LODs, UVs, bakes, normal maps, axes and units | "This model has 400k triangles, make it work in Roblox" |
polywright-print |
Making a model printable: one watertight solid in millimetres, design rules, splitting, multi-colour 3MF, slicer CLIs | "Make this game model printable as a 100 mm figure" |
The hub (polywright) takes a request no sibling clearly owns and hands over. The siblings use the hub's scripts/pw.py, so install all seven together.
- It reads its
evergreen.jsonfirst. When the research is past its due date, the skill says so, does the task, then refreshes its research from dated sources. - It proves a step with numbers (
pw.py inspect,pw.py check) and one picture (pw.py renderwritessheet.png), never with a generator's or a script's own claim. - It records every outside input with its licence, and every AI model that made a part, in the asset's
manifest.json(The asset contract). - It writes lessons to its
LEARNINGS.mdwhen something goes wrong.
| File | Holds |
|---|---|
SKILL.md |
The instructions the agent reads |
references/ |
Detail the skill loads only when needed (the CLI reference, target budgets, Blender recipes, generator table) |
RESEARCH.md |
Dated findings with sources, open questions, and a search plan in four tracks (subject, tooling, practice, testing) |
CHANGELOG.md |
Every change to the skill, with its reason |
LEARNINGS.md |
Lessons, each with a trigger, a hypothesis and a rule |
TESTS.md, evals/evals.json
|
Test cases (triggers, decoys, an action case, an outcome case) and every run |
MAINTENANCE.md, evergreen.json
|
The upkeep rules and state: tier, interval, next due date |
Measured on 2026-10-11 with version 0.1.1: each case's prompt went to a fresh headless Claude Code session (claude -p) with the plugin installed, and the evidence was a call to the skill in the session's trace. Each case ran once.
| Skill | Trigger and decoy cases passed |
|---|---|
| polywright | 3 of 4 |
| polywright-references | 4 of 4 |
| polywright-capture | 4 of 4 |
| polywright-generate | 3 of 4 |
| polywright-blender | 2 of 4 |
| polywright-finish | 3 of 4 |
| polywright-print | 4 of 4 |
All 14 decoys passed: no skill fired on a request it does not own. Of the five misses, two went to a sibling that arguably owns the request: a real park fountain went to capture, and a Roblox request went to the hub, which hands over to finish. Three were requests the model handled without loading a skill: a Blender traceback, a batch-export script, and a drawing that was not attached. The runs are logged in each skill's TESTS.md.
Two action cases ran the same way. The print case invoked polywright-print and ran pw.py printable and pw.py check. The capture case ran pw.py place correctly without loading its skill, because the prompt spelled out the command; that prompt was rewritten.
This wiki describes polywright 0.1.2 and was last updated on 2026-10-11. The plugin is MIT licensed. Report problems in the issues.
Using it
- Getting started
- The skills
- Commands
- How checks decide
- The asset contract
- Errors and edge cases
- Recipes
- FAQ
The releases
Contributing
Elsewhere