Skip to content

The Skills

m4bwav edited this page Oct 12, 2026 · 1 revision

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.

The seven skills

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.

What every skill does the same way

  • It reads its evergreen.json first. 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 render writes sheet.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.md when something goes wrong.

Companion files in each skill folder

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

How often each skill fires

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.

Clone this wiki locally