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 agentmods add skills/plausibleventures/lattice/performancenpx skills add plausibleventures/lattice --skill performancegit clone --depth 1 https://github.com/plausibleventures/latticeWhat 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 | $0.00067 | $0.03482 |
| Opus 5 | $0.00034 | $0.01741 |
| Sonnet 5 | $0.00013 | $0.00696 |
| Haiku 4.5 | $0.00007 | $0.00348 |
Grade A, and why
performance 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 2d 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 — 254 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Performance
The budget is 8 ms a frame for everything. Almost nothing in this kit costs a measurable fraction of that; when a Lattice game is slow it is almost always one of about six specific things, and this skill is those six in the order they are worth checking.
Measure before you change anything. Half the optimizations people reach for here are unavailable — there is no sprite cache to add, it was measured and deleted — and the other half are in the wrong place.
First: is the number you are reading true?
Two instruments, and the one that reads better is blind.
import type { Loop } from '@latticekit/loop';
export function verdict(loop: Loop): string {
const gap = loop.stats.worstGapMs; // wall time between two PAINTED frames
const cadence = loop.stats.cadenceMs; // the display's own period, as observed
// The verdict is the RATIO. Under about 1.5 cadences dropped no frames.
return `${gap.toFixed(1)} ms worst against a ${cadence.toFixed(1)} ms display`;
}
loop.stats.worstFrameMs is the pump's own wall time — the loop reads the clock on the way
into a pump and on the way out. A garbage collection, a style recalculation, or anything else
that lands between two pumps is in neither reading. That is not hypothetical:
- one game measured 23.1 ms worst on one machine and 13.1 ms on another for the same build, because whether the pause lands inside a pump is machine-dependent and the readout is not;
- another shipped a HUD reading
0.0 msagainst a real worst gap of 9.2 ms; - a third latched
worstFrameMsat the close of each window and displayed0.0 msfor the first ten seconds, because it was showing its own initializer and nothing renders in zero milliseconds.
worstGapMs is the wall time from one painted frame to the next, so everything in between is
inside it by construction, and it is measured from the loop's own single clock reading rather
than from performance.now().
Read it next to cadenceMs, never next to a budget. A gap contains a whole display period
that is not work: 16.7 ms is a perfect frame on a 60 Hz panel and 8.3 ms is a perfect one at
120 Hz. budgetMs is a work budget and belongs to overBudget, which counts pumps.
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.
- 2d ago First seen · 254 lines · 67 tokens per session scan A 7da65fe9953e
performance is a skill published in the GitHub repository plausibleventures/lattice (35 stars, last pushed 10d ago), licensed MIT. It adds 67 tokens to every session and 3,482 once invoked, about $0.0003 per session on Opus 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-08-30.
Other skills, from other repositories
assets-get-data
Get asset data from the asset file in the Unity project — every serializable field and property. Supports token-saving path-scoped reads via paths or viewQuery. Use 'assets-find' to find the asset first.
gameobject-component-destroy
Destroy one or more Components from a target GameObject. Missing (null) components are skipped — they cannot be destroyed. Use 'gameobject-find' and 'gameobject-component-get' to identify the components first.
gameobject-set-parent
Reparent a batch of GameObjects under a new parent in the currently opened Prefab or active Scene. Per-item failures are reported in the returned status string instead of aborting the batch. Use 'gameobject-find' to locate the GameObjects first.
assets-prefab-save
Save the currently opened prefab edit stage back to its prefab asset without exiting the stage. Pair with 'assets-prefab-open' to enter the edit mode first.
console-get-logs
Retrieve Unity Editor logs from the MCP plugin's LogCollector, optionally filtered by log type or time window. Useful for debugging and monitoring Editor activity.
package-remove
Uninstall a UPM package from the Unity project. Modifies manifest.json and may trigger a domain reload — the final result is delivered after the reload via the request's requestId. Built-in packages and packages that are dependencies of others cannot be removed. Use 'package-list' to list installed packages first.