Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Nice-Wolf-Studio/unity-claude-skills --skill unity-surface-preflightgit clone --depth 1 https://github.com/Nice-Wolf-Studio/unity-claude-skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/nice-wolf-studio/unity-claude-skills/unity-surface-preflight)<a href="https://agentmods.dev/skills/nice-wolf-studio/unity-claude-skills/unity-surface-preflight"><img src="https://agentmods.dev/badge/skills/nice-wolf-studio/unity-claude-skills/unity-surface-preflight/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/nice-wolf-studio/unity-claude-skills/unity-surface-preflight"><img src="https://agentmods.dev/badge/skills/nice-wolf-studio/unity-claude-skills/unity-surface-preflight.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00085 | $0.02800 |
| Opus 5.5 | $0.00034 | $0.01120 |
| Sonnet 5.5 | $0.00017 | $0.00560 |
| Haiku 4.5 | $0.00009 | $0.00280 |
Grade A, and why
unity-surface-preflight scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 87 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Unity surface preflight
Exactly one of four surfaces is true before you touch a Unity project — live Editor, batch, blocked-on-Safe-Mode, or unknown-and-must-ask — and you owe yourself evidence for the one you pick. The skill already loaded in this session catalogues each failure mode on its own page, hands you no rule for choosing between them, and at SK:184 lets a disclosed direct file edit follow the words "no reachable Editor" without asking you to rule out either way that conclusion goes wrong.
The Iron Law
"NO EDITOR" IS A CONCLUSION, NOT A COMMAND OUTPUT. NEVER EDIT SCENE, PREFAB, OR ASSET YAML
UNTIL BOTH FALSE NEGATIVES ARE RULED OUT AND THE FALLBACK IS SAID OUT LOUD.
A probe you could not run is not a probe that came back empty. A denied tool call, a binary missing from PATH, a shell whose view of the machine you cannot vouch for — each leaves the surface UNKNOWN, and UNKNOWN is a question you put to the human. It is never a licence to open the YAML instead.
The Gate
pwd. Confirm the directory you are calling the project root holdsProjectSettings/ProjectVersion.txt, read this session — not remembered from an earlier one.- Walk
references/decision-table.mdfrom the top and stop at the first predicate that matches. First match wins; do not skip a row because you expect its answer. - Name, in your response, the surface you resolved and the command output you resolved it from. One sentence, quoting the payload.
- Only now act. No named surface, no serialized-asset edit.
If step 2 cannot finish because a probe was denied, errored, or was never available to you, the resolved surface is UNKNOWN and step 4 is "ask the human", not "fall back to the file". Inability to reach the CLI is the strongest reason to distrust "no Editor", not a shortcut past it.
Red Flags — STOP
| Thought | Reality |
|---|---|
| "A status probe says no instances, so the Editor is closed." | Two different things produce that output and neither means "closed". (a) A sandboxed agent shell reproduces "no instances" against a genuinely running Editor — this caveat does not exist in the skill you have loaded (R1b §B/§D: GitHub-only). (b) A headless/batch-launched Editor serves commands and is never listed by unity status at all, because its lockfile heartbeat differs from a GUI Editor's — confirm reachability with unity list --project-path <project>, not unity status (IA:162-164) — and that probe answers in exactly two shapes, neither of them "empty": a tool catalog (151 entries in Increment 0), or errors[0].code == "COMMAND_FAILED", "No Pipeline instance found for project", at exit 6 (issue #27). |
| "Exit 6 means I have to pick an Editor." | Exit 6 covers more than one condition. unity status --format json with nothing running returns success:false, data.count:0, data.instances:[], errors[0].code:"STATUS_NO_INSTANCES" — observed on this machine by live probe; IA:337 carries only the STATUS_NO_INSTANCES code token, not the payload shape, and is not a citation for data.count:0 [R4-M5] — that is no candidates, not too many. AMBIGUOUS_EDITOR (SK:30; IA:21,44) is only the right branch when data.candidates is non-empty. Read errors[0].code and data.candidates, never the exit code alone. |
"unity pipeline list will tell me if this project is in Safe Mode." |
pipeline list is machine-wide. unity pipeline list --help lists no options of its own beyond -h, --help (a Global Options block prints after it — the CLI's shared set, not this subcommand's); passing --project-path returns error: unknown option '--project-path' and exit 2. The per-project answer is a filter over data.instances[] on the field carrying the project path — observed in Increment 0 as projectPath (Delta D2). The machine-wide key is data.summary.instancesInSafeMode. And pipeline list exits 0 even when it finds nothing (observed: success:true, data.instances:[], all six summary counters 0, exit 0) — while unity status with nothing running exits 6. Gating on pipeline list's exit code learns you nothing; read data.summary. |
| "Driving a fresh headless Editor gets me the same place." | It does not, and doing it silently is a substitution with no disclosure. The one sentence the installed skill gives you (SK:184) covers disclosing a direct file edit; it does not cover silently swapping control surfaces. |
| "The user says the Editor is open, so it is." | It may be, and the probe may still be blind to it — see row 1. A claim sitting in the task you were handed answers no question, because at that moment you had not asked one; it is the brief, not a reply. What counts is a human sentence that lands after all three probes, in this session, addressed to the question you put. Getting told up front makes asking more necessary, not less — that is the case where you would otherwise never ask at all. And even a real answer settles only the sandbox question, never that a project sits at state ready. |
"isRunning: true, so a process is alive and only the bridge is down." |
isRunning: true was watched with no Unity Editor process on the machine at all, so it is not a look at the process table; what it is reading is not established, and nothing here tells you. pipelineServer.isReachable is the key that speaks to reachability. Watched on 2026-09-14 with the Editor shut and no Unity binary running: {"isRunning":true,"hasPipelinePackage":true,"pipelineServer":{"isReachable":false,"apiUrl":null}}, summary.runningInstances: 1, against unity status → STATUS_NO_INSTANCES (issue #30). When they disagree, unity status and isReachable carry it. A lone isRunning: true is not an instance, is not a broken bridge, and is not a reason to stay out of row 5. |
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 87 lines · 85 tokens per session scan A 2e5f01f4bdad
unity-surface-preflight is a skill published in the GitHub repository Nice-Wolf-Studio/unity-claude-skills (40 stars, last pushed 1mo ago), licensed MIT. It adds 85 tokens to every session and 2,800 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-16.
Other skills, from other repositories
playtest-report
Structured playtest report template, or turn existing playtest notes into structured feedback.
godot-signals-groups
Build event-driven, decoupled Godot 4.7 gameplay with signals and node groups: declare and emit custom signals, connect with Callables (incl. bind/one-shot), and broadcast to many nodes via groups and callgroup. Use when wiring node communication in a Godot project, replacing tight references with signals…
motion
Reconstruct a skeleton from calibrated mesh projections and sequential VLM joint annotations, then fit joints and skin weights. Generate motion from joint-position trajectories, rhythm and contact constraints through IK; refine bone orientation against the action, then export, retarget and validate on the target mesh.
unity-addressables
Manage Addressables groups, entries, profiles and content builds (com.unity.addressables, reflection-based).
unity-manual-component
Manually add, configure, reorder, and copy components on GameObjects using Unity Editor UI. For one-off Inspector workflows that do not need REST automation.
threejs-exposure-color-grading
Build a measured exposure and grading path in Three.js. Use for a 64x36 encoded luminance meter, asynchronous readback, weighted log-average exposure, asymmetric adaptation, single tone-map ownership, and a generated 32-cube post-tone-map LUT.