Minimizing Ty Ecosystem Changes
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
Act on the devlog/breadcrumb comment findings from scripts/lint.lg — decide per hit whether to rewrite or delete a comment, and rewrite it so it describes the code rather than the change that…
$ npx skills add nooga/let-go --skill comment-lint -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nooga/let-go comment-lint --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/comment-lint .claude/skills/comment-lint && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .claude/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lintType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add nooga/let-go --skill comment-lint -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nooga/let-go comment-lint --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/comment-lint .agents/skills/comment-lint && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .agents/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nooga/let-go --skill comment-lint -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nooga/let-go comment-lint --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/comment-lint .cursor/skills/comment-lint && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .cursor/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/nooga/let-go.git --path .agents/skills/comment-lint--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add nooga/let-go --skill comment-lint -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nooga/let-go comment-lint --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/comment-lint .gemini/skills/comment-lint && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .gemini/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install nooga/let-go comment-lintInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add nooga/let-go --skill comment-lint -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/comment-lint .github/skills/comment-lint && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .github/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nooga/let-go --skill comment-lint -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nooga/let-go comment-lint --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nooga/let-go.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/comment-lint .opencode/skills/comment-lint && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "comment-lint" agent skill from https://github.com/nooga/let-go/tree/main/.agents/skills/comment-lint into .opencode/skills/comment-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "comment-lint", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
comment-lintAct on the devlog/breadcrumb comment findings from scripts/lint.lg — decide per hit whether to rewrite or delete a comment, and rewrite it so it describes the code rather than the change that…
Comment Lint is an agent skill from nooga/let-go. Act on the devlog/breadcrumb comment findings from scripts/lint.lg — decide per hit whether to rewrite or delete a comment, and rewrite it so it describes the code rather than the change that produced it. Use when running the comment linter, cleaning up flagged comments, reviewing a comment-cleanup diff, or writing a comment that describes why code has its current shape.
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Linting and formatting. The repository describes itself as: Almost Clojure written in Go. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit a13e042. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Comment Lint loads about 2.5k tokens when it runs. Until then it costs about 97 tokens; SKILL.md has 1,508 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from nooga/let-go at commit a13e042, republished under its MIT licence (© nooga). 1,508 words, ~2,509 tokens.
.claude/skills/comment-lint/SKILL.md (or your agent's skills folder).Drives scripts/lint.lg, the report-only scan for comments that narrate a
change instead of describing the code. The script decides what to look at;
everything below is the judgement it deliberately leaves out. Rationale and the
open phrase-list questions: nooga/let-go#835.
From the repository root:
lg scripts/lint.lg # default: pkg scripts
lg scripts/lint.lg pkg scripts cmd # widen the scanReport-only. It never edits source, and findings do not affect the exit status (a run that finds 13 things still exits 0), so a hit is never a build gate and never an instruction on its own.
A hit flags a comment block to re-read, not a phrase to delete. The phrase list matches tense markers — "used to be", "moved from", "this PR" — because those are cheap to match and rarely appear in a description of working code. The thing being flagged is the narration underneath, which can survive any edit that only removes the matched words.
So the linter going quiet is not the goal. The goal is a comment that a reader who has never seen a previous version of the file can use.
Would this sentence still be true and useful to someone reading this file for the first time, who has no idea it was ever different?
If removing the comparison leaves the sentence incomplete, the comparison was history and the sentence needs rewriting, not trimming.
These two look alike and are not alike.
Counterfactual — keep. What goes wrong without the code as it stands. This is the honest content of most regression-test and benchmark comments, and it is frequently the right rewrite:
// derefSink defeats dead-code elimination: without a package-level sink the
// compiler may elide the Deref call entirely, producing impossible sub-ns
// numbers that say nothing about the real cost.A reader can check that against the code in front of them, and nothing in it needs a previous version of the file to parse.
Historical contrast — rewrite. The previous design, re-tensed. The giveaway
words are rather than, instead, not X but Y, alone could do without,
only got away without:
// It is passed to the module scaffolder rather than baked in, because the
// AOT native path shares that code.rather than baked in only parses if you know it was once baked in. The
second clause is subtler, and it is the reason the rule above exists: the AOT
rationale is true — pkg/gomod's package doc states it, naming #596 and the
three behaviors — but it is a fact about pkg/gomod, already written on
pkg/gomod. Restating it on a constant in pkg/cli is a second copy that only
the change's author would think to put there. When a kept claim checks out,
ask where it already lives before keeping it here.
Removing the flagged phrase without removing the history is the failure mode this skill exists to prevent. It passes the linter and changes nothing for the reader.
Passing the test above does not make a sentence true. A rewrite that keeps the old comment's shape keeps its claims, and the claims are the part most likely to have gone stale:
// asBytes backs the binary file/stream sinks (spit, write!). The byte-array
// case is the one that needs it: without the coercion, a byte-array handed to
// spit/write! stringifies to its #byte-array[…] repr, so bytes >127 never
// reach the sink.Two defects, neither of them visible to the linter. The stringify claim is true
of write! — iort.go falls back to vs[1].String() — and false of spit,
which returns spit expected String or byte-array rather than writing anything.
One sentence asserts one behavior for two callers that do different things. And
where the claim does hold, iort.go already states it on the code itself, so
repeating it on a test is the second-copy defect from the wasm.go case above.
Rewrite from the function instead: it converts a String or a byte-kind
TypedArray and rejects everything else. That is checkable in one place and
stays true whatever the callers do next.
Do not assume every flagged comment has a salvageable core. Three outcomes, in rough order of frequency:
the miscompile this PR fixes → the miscompile.)Every causal claim you keep must name code you can point at. A rewrite inherits the old comment's assertions, and those were true of a tree that has moved. Before keeping "because X shares this" or "so that Y can Z", find X and Y in the current tree — repository-wide, including tests and build-tagged files, not just the package in front of you. If you cannot, the claim is history and goes; if you can, check whether the place it is already documented is a better home than this one.
Outcome 3 is where accuracy slips. A comment written as history was true of
code that no longer exists, so its details can be stale in ways the linter
cannot see: a benchmark comment naming the fields root and curr survived a
rename to root and rootBind, and re-tensing it would have preserved the
wrong names. Read the code before rewriting; do not paraphrase the old
comment.
The rewrite is not free space. Every clause you add is a claim you now own and that someone has to maintain, so the bar for adding one is the bar for any new comment: not "is it true" but "does a reader of this file need it here."
Prefer removal to replacement. Most flagged blocks are a good comment with a clause welded on. Cutting the clause is finished work. Replacing the block invites you to restate things that are already written somewhere better.
Before adding a fact, find where it already lives. If the claim belongs to
another file's code, that file is its home; a copy here is the wasm.go defect,
and it rots independently of the original.
Stop when the sentence is checkable against the code in front of you. Not when it is complete, not when it explains the design — when a reader with this file open can verify it without opening another.
Naming a symbol buys precision and a rename hazard. Name one when it is the only handle a reader has, and prefer a symbol a rename would have to touch over a file path or a line number, which nothing keeps honest.
Do not rank what the code does not rank. "The byte-array case is the one
that needs it" elevates one of the three cases TestAsBytes covers. That
emphasis is the author's view of which case was interesting — a fact about the
change, not about the code — and it is often the re-tensed ghost of a
superlative like "the one that used to be impossible". Describe the cases and
let the reader decide which one they came for.
Do not carry a bare issue or PR number into a block you are rewriting. A
number that only records where a change was discussed is provenance; git blame
and the PR already hold it, and in a comment it rots silently. An identifier
that is the only name a thing has may stay: the native adapters #438 Def'd at init names something with no other handle, while (#506) trailing a list of
three functions names nothing the sentence has not already said.
This is scoped to the block you already have open. It is not a license to sweep every ID in the tree — that question, and the phrase list generally, is open on nooga/let-go#835, and the split above is the current lean rather than a settled position.
Never drop an invariant. Flagged comments often carry the only written record of why something must be done in a particular order, why a simpler form breaks, or what a test is actually pinning. Losing that to satisfy a report-only linter is a strictly worse outcome than leaving the comment alone. When the narration and the invariant cannot be separated, keep the comment and say so in the PR rather than shipping a lossy rewrite.
devlog-phrases order, not the one appearing earliest in the comment. Fixing
it can expose a second in the same block, so re-run the linter after a sweep
rather than trusting one pass..lg file that pkg/rt/generated.manifest lists
changes generated artifacts. The manifest digests its source inputs and
generated.sums digests the manifest, so a comment-only edit to one needs
make generate, and both files are committed. Being git-tracked is not the
test — most .lg files under pkg/ are inputs, while scripts/lint.lg and
cmd/lginterop/lginterop.lg are not. Grep the manifest for the path. The compiled outputs are
byte-identical — comments never reach the reader's form tree, which is also
why the linter has to scan raw source.The tool reports; you exercise the judgement.
© nooga, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/comment-lint of nooga/let-go.
Open the folder on GitHubat commit a13e042
Comment Lint next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Comment Lint this skillnooga/let-go | 568 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | — | ~2.2k | Automated safety check: Pass | MIT |
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
sgl-project/sglang
Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
astral-sh/ruff
A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
nooga/let-go
Coordinate heavy local workloads across worktrees, processes, and subagents — benchmarks and timing-sensitive gates run exclusively on a quiesced machine, while builds, test suites, regeneration…
nooga/let-go
Audit documentation hygiene for the let-go docs/ tree — find stale or unverified docs, dangling or one-sided supersession links, duplicate authoritative-for claims, and docs missing from the README…
Categories
Act on the devlog/breadcrumb comment findings from scripts/lint.lg — decide per hit whether to rewrite or delete a comment, and rewrite it so it describes the code rather than the change that…. Comment Lint is an agent skill from nooga/let-go.lg — decide per hit whether to rewrite or delete a comment, and rewrite it so it describes the code rather than the change that produced it.
Comment Lint fits situations like: running the comment linter; cleaning up flagged comments; reviewing a comment-cleanup diff; writing a comment that describes why code has its current shape.
Run `npx skills add nooga/let-go --skill comment-lint -a claude-code`. Or copy the skill folder (.agents/skills/comment-lint in nooga/let-go) into .claude/skills/comment-lint in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nooga/let-go --skill comment-lint -a codex`. Or copy the skill folder (.agents/skills/comment-lint in nooga/let-go) into .agents/skills/comment-lint in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nooga/let-go --skill comment-lint -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/comment-lint, .gemini/skills/comment-lint, .github/skills/comment-lint and .opencode/skills/comment-lint in your project.
Going by SKILL.md and its folder, Comment Lint needs the command-line tools its instructions call (make).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Comment Lint is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Comment Lint: Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), Babysit PR To Pass CI (sgl-project/sglang, 37k stars) and Rust Best Practices (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nooga (a GitHub user) maintains it in nooga/let-go, which has 568 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 9, 2026.
Source: nooga/let-go on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.