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 painhardcore/pstack --skill statechartgit clone --depth 1 https://github.com/painhardcore/pstackWrote 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/painhardcore/pstack/statechart)<a href="https://agentmods.dev/skills/painhardcore/pstack/statechart"><img src="https://agentmods.dev/badge/skills/painhardcore/pstack/statechart/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/painhardcore/pstack/statechart"><img src="https://agentmods.dev/badge/skills/painhardcore/pstack/statechart.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.00070 | $0.02187 |
| Opus 5.5 | $0.00028 | $0.00875 |
| Sonnet 5.5 | $0.00014 | $0.00437 |
| Haiku 4.5 | $0.00007 | $0.00219 |
Grade A, and why
statechart 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 3d 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 — 82 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Statechart
The chart shows how a system moves between states, in the words of the person who reads it. That person, the reader, decides whether the behavior is right.
Run
Work in a scratch folder outside the repo. Write a TLA+ spec and its config. Then run:
<skill dir>/scripts/statechart SPEC.tla [--config FILE] [--view FILE] [--out DIR]
scripts/statechart.ts is TypeScript, so run it with a runtime that can execute TypeScript.
The first run installs TLC and Java with mise and needs the network.
Write the spec
- Write each rule that the reader agrees to as an INVARIANT. A rule can be about a screen, a result, a stored value, or a message. If the model has no variable for a rule, add the variable. Never weaken a rule to make it hold.
- Write
Nextas a disjunction of the actions, such asYouPressPlay \/ YouPressStop. If you do not, TLC names every stepNext. - A state with no step out breaks
NoDeadlock, also when it is a correct end state. When an INVARIANT or a PROPERTY already has that name, the rule isCHECK_DEADLOCK. Add toNextan action that is true only in the end states and changes nothing, such asDone == phase \in {"paid", "failed"} /\ UNCHANGED vars, and give it a label instep().
Pick the chart
You do the work that needs judgment: the words on each state and arrow, the phases and their colors, the title, and the report to the reader. Put your work in a view module, and give it with --view.
To show the reader's words, the view exports state(vars). The value that state() returns picks the form:
- A string gives a flat chart:
export const state = (v) => (v.paid ? "Paid" : "Paying"); - An array gives parent states:
export const state = (v) => v.main.split("."); - An object gives one parallel region for each key:
export const state = (v) => ({ Playback: v.playback, Volume: v.volume });
Label each state with what the reader can see or cares about, such as "Paying" or "Lease held, write pending". Keep variable names out of labels. In vars, a TLA+ sequence is an object with keys from 1, so v.pc[1] is pc[1]. A set is an array.
What ships with it
60 files 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.
- references/render.md 3.6 KB
- scripts/backends/cfg.ts 1.2 KB runs code
- scripts/backends/mermaid.ts 7.3 KB runs code
- scripts/backends/plain-text.ts 2.3 KB runs code
- scripts/backends/report.ts 6.9 KB runs code
- scripts/frontends/config.ts 10 KB runs code
- scripts/frontends/dot.ts 2.4 KB runs code
- scripts/frontends/marks.ts 3.2 KB runs code
- scripts/frontends/messages.ts 1.8 KB runs code
- scripts/frontends/spec.ts 4.1 KB runs code
- scripts/frontends/trace.ts 988 B runs code
- scripts/frontends/value.ts 4.6 KB runs code
- scripts/frontends/verdict.ts 1.7 KB runs code
- scripts/frontends/view.ts 4.3 KB runs code
- scripts/ir.ts 15 KB runs code
- scripts/package.json 233 B
- scripts/passes/annotate.ts 3.7 KB runs code
- scripts/passes/label.ts 8.4 KB runs code
- scripts/passes/lift.ts 2.8 KB runs code
- scripts/passes/loop-check.ts 2.1 KB runs code
- scripts/passes/paths.ts 1.9 KB runs code
- scripts/passes/reach.ts 4.0 KB runs code
- scripts/passes/region-check.ts 3.4 KB runs code
- scripts/passes/regions.ts 9.3 KB runs code
- scripts/pipeline.ts 2.9 KB runs code
- scripts/run.ts 17 KB runs code
- scripts/statechart 991 B
- scripts/statechart.ts 5.9 KB runs code
- scripts/test/chart.test.ts 39 KB runs code
- scripts/test/charts/Braces.mmd 312 B
- scripts/test/charts/Escapes.mmd 244 B
- scripts/test/charts/Phases.mmd 584 B
- scripts/test/cli.test.ts 49 KB runs code
- scripts/test/config-fuzz.test.ts 8.5 KB runs code
- scripts/test/ConfigOracle.java 2.7 KB
- scripts/test/corpus.test.ts 13 KB runs code
- scripts/test/corpus/Counter/chart.mmd 112 B
- scripts/test/corpus/Counter/ChartRun.out 2.6 KB
- scripts/test/corpus/Counter/Counter.cfg 64 B
- scripts/test/corpus/Counter/Counter.tla 185 B
- scripts/test/corpus/Counter/graph.dot 633 B
- scripts/test/corpus/Counter/report.md 243 B
- scripts/test/corpus/Counter/sany.out 37 KB
- scripts/test/corpus/Counter/verdict-1.out 2.1 KB
- scripts/test/corpus/CounterAction/chart.mmd 518 B
- scripts/test/corpus/CounterAction/ChartRun.out 2.7 KB
- scripts/test/corpus/CounterAction/CounterAction.cfg 89 B
- scripts/test/corpus/CounterAction/CounterAction.tla 255 B
- scripts/test/corpus/CounterAction/graph.dot 798 B
- scripts/test/corpus/CounterAction/report.md 436 B
- scripts/test/corpus/CounterAction/sany.out 43 KB
- scripts/test/corpus/CounterAction/verdict-1.exit 3 B
- scripts/test/corpus/CounterAction/verdict-1.out 2.1 KB
- scripts/test/corpus/CounterAction/verdict-2.exit 3 B
- scripts/test/corpus/CounterAction/verdict-2.out 3.1 KB
- scripts/test/corpus/CounterAction/verdict-3.out 2.6 KB
- scripts/test/corpus/CounterDeadlock/chart.mmd 462 B
- scripts/test/corpus/CounterDeadlock/ChartRun.out 2.7 KB
- scripts/test/corpus/CounterDeadlock/CounterDeadlock.cfg 63 B
- scripts/test/corpus/CounterDeadlock/CounterDeadlock.tla 225 B
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.
- 3d ago First seen · 82 lines · 70 tokens per session scan A 64e507b62e14
statechart is a skill published in the GitHub repository painhardcore/pstack (18 stars, last pushed 4d ago), licensed MIT. It adds 70 tokens to every session and 2,187 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-11-03.
statechart compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| statechartpainhardcore/pstack | Skill | 18 | 4d ago | MIT | A | 70 | Claude Code, OpenCode |
| experiment-craftEvoScientist/EvoSkills | Skill | 486 | 10d ago | Apache-2.0 | A | 172 | Claude Code |
| issue-analyzesd0xdev/sd0x-harness | Skill | 194 | 29d ago | MIT | A | 73 | Claude Code |
| debugsd0xdev/sd0x-harness | Skill | 194 | 29d ago | MIT | A | 67 | Claude Code |
| code-exploresd0xdev/sd0x-harness | Skill | 194 | 29d ago | MIT | A | 51 | Claude Code |
| code-investigatesd0xdev/sd0x-harness | Skill | 194 | 29d ago | MIT | A | 52 | Claude Code |
| git-investigatesd0xdev/sd0x-harness | Skill | 194 | 29d ago | MIT | A | 53 | Claude Code |