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/jjanczur/tyran/code-reviewnpx skills add jjanczur/tyran --skill code-reviewgit clone --depth 1 https://github.com/jjanczur/tyranWrote 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/jjanczur/tyran/code-review)<a href="https://agentmods.dev/skills/jjanczur/tyran/code-review"><img src="https://agentmods.dev/badge/skills/jjanczur/tyran/code-review.svg" alt="Measured on agentmods" 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 | $0.00080 | $0.01775 |
| Opus 5 | $0.00040 | $0.00888 |
| Sonnet 5 | $0.00016 | $0.00355 |
| Haiku 4.5 | $0.00008 | $0.00178 |
Grade A, and why
code-review 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 4d 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 — 120 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Code review — reading depth
This is HOW a diff is read. WHAT the verdict looks like belongs to
tyran:reviewer— APPROVE, REVISED or CHANGES-REQUESTED, numbered executable counterexamples, a re-review that first checks the previous round's findings are pinned as tests, and a section naming what was not checked. Do not restate any of that here; two definitions of "reviewed" drift apart, and the drift only shows up when they disagree in front of someone.
Read the diff twice, for different things
First pass — does it do what the story says? Against the acceptance criteria, not against your idea of the feature. A correct implementation of the wrong thing is the most expensive defect on this list, and it is the one a dimension sweep never catches.
Second pass — the sweep below. Every dimension gets looked at explicitly. Skipping one is a decision that belongs in the "did not check" section, not a gap nobody notices.
The dimensions
- Correctness at the edges. Empty, one, many. Zero, negative, overflow. The first and last iteration. Null versus absent versus empty-string — three different states that most code conflates and most tests exercise as one.
- Boundaries and shared zones. Does the change reach outside its story's scope? An API shape, a schema, a shared file, a generated artefact, a published type. Those are the conductor's to authorise, and a review that waves one through has spent authority it does not have.
- Concurrency and ordering. Two of these running at once: what is read after being written elsewhere, what assumes it is alone, what holds a lock and what forgot to release one on the failure path.
- Failure paths. Follow every error to where it is handled. An error that is caught and logged is not handled; an error swallowed to keep a pipeline green is a silent failure with a good story. Check the partial failure — the write that succeeded before the one that did not.
- Secrets and untrusted input. Anything reaching a shell, a query, a path, a template or a rendered page. Values from the environment or a fixture that look like real credentials. This dimension has a floor: it is reviewed properly or the review is not finished.
- Test quality, not test count. Does each new test fail when the behaviour is broken? Delete a line of the implementation in your head and ask which test goes red — if the answer is none, the test asserts nothing. Watch for a test that pins the CURRENT output rather than the CORRECT one, which converts a bug into a requirement. And watch what the test's OWN inputs are made of: a fixture that hand-builds a value another function normally derives (a mapper, a parser, a coercion) exercises only the consumer of that value, never the step that derives it, and can pin THAT step's defect as correct without ever calling it. A three-state flag silently collapsed to two states survived two review rounds this way — every guard test hand-built the post-coercion object, and the only two tests that called the real producer were themselves asserting the coerced, wrong value. Trace at least one test through the real producer, not a stand-in for its output.
- Resource lifecycle. What is opened, started, spawned or leased, and where it is closed — including on the path where an exception is thrown.
- Data access and wasted work. Count the round trips one request makes
and how the count moves with the rows. A query, fetch or RPC inside a loop
or an awaited per-item
mapis 1 + N; one query over the set (a join, anIN, a loader) is the shape. Awaits with no data dependency between them run together, fan-out bounded — unbounded over a pool or a rate limit, a slow request becomes a failed one. The same pure computation over the same inputs runs once per request. A cache comes AFTER those, never instead: a cache over a query that should not have run is a defect with a warm cache, and one the diff adds or touches must say what invalidates it and why the TTL is that number — a TTL is the staleness the product agreed to, and a number with no reason is the first stale read filed in advance. None of this shows in the diff alone: a helper that runs one query is correct where it is written and N+1 where a loop calls it, so follow the new call up to the request that triggers it. Rank by the path — a query on every page load is a finding, a nightly job over twelve rows is aNOTES.mdline. The finding is a count, "N+1 queries for N rows, expected 1": an input and an expected result, so it pins as a test against the query log. - Structure. A thousand-line file is built one reasonable addition at a
time, so the question is about THIS addition: does it give a module a second
reason to change, or grow the largest file in its area? A new concern is a
new module, and the simplest change that meets the criteria is the bar — a
layer, an option or a generic helper introduced for the one caller the story
has is the opposite failure, not the cure;
deslopalready names it as slop. This finding is a location, not a counterexample: the file, the two responsibilities it now carries, the seam between them. It is the story's finding only when the story made the tangle; a giant the story merely touched is aNOTES.mddebt, and splitting it here is the work nobody asked for. - The gate itself. If the change touches a check, ask what that check can no longer see. A loosened tolerance, a narrowed selector, a broadened try/catch and a skipped test all keep the run green while removing its meaning.
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.
- 4d ago First seen · 120 lines · 80 tokens per session scan A 422cce9b1940
code-review is a skill published in the GitHub repository jjanczur/tyran (87 stars, last pushed yesterday), licensed Apache-2.0. It adds 80 tokens to every session and 1,775 once invoked, about $0.0004 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
watch
File sentinel that monitors the working directory for changes and marker comments, then auto-triggers appropriate skills. Poll-based via git diff against the last scan commit. Writes intake items for batch processing and routes marker actions through /do. Use for automatic reactions to file changes; do NOT use for…
live-preview
Mid-build visual verification loop. Takes screenshots of components during construction, not just after. Catches visual regressions and invisible features before they compound. Requires Playwright or similar screenshot tool.
new-skill
Scaffold a new brooks-lint analysis skill so it passes npm run validate and npm run evals on the first try — generates skills/{name}/SKILL.md (with the mandatory "Do NOT trigger for:" clause and a Process section citing guide step ranges) plus skills/{name}/{name}-guide.md (sequentially numbered steps), then appends…
brooks-sweep
Full-sweep mode: runs a unified analysis across all quality dimensions — code decay, architecture, tech debt, and test quality — then applies fixes directly to the codebase. Safe changes are auto-applied; risky changes are confirmed before execution. Drawing on twelve classic engineering books. Triggers when: user…
heartbeat
This skill should be used when the user asks to "run a heartbeat", "run the agent loop", "process GitHub issues", "check for work", or runs the /heartbeat command. Executes the WoterClip heartbeat — picks up GitHub issues, resolves personas, does work, and reports back.
brainstorm
Explores a codebase, researches the problem space, and produces an approved design specification before any code is written. Use when the user wants to create a new feature, add significant functionality, redesign a subsystem, or build something that touches multiple parts of the project.