Babysit PR To Pass CI
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.
Check every changed hunk of a pull request against conventions written in prose (naming, error handling, logging, docs) with a keyless classifier, and comment only on findings above a confidence…
$ npx skills add mrmps/classifier-dev --skill semantic-ci-lint -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mrmps/classifier-dev semantic-ci-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/mrmps/classifier-dev.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/semantic-ci-lint .claude/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .claude/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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/mrmps/classifier-dev/tree/main/skills/semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-lint -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mrmps/classifier-dev semantic-ci-lint --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mrmps/classifier-dev.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/semantic-ci-lint .agents/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .agents/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-lint -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mrmps/classifier-dev semantic-ci-lint --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mrmps/classifier-dev.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/semantic-ci-lint .cursor/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .cursor/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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/mrmps/classifier-dev.git --path skills/semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-lint -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mrmps/classifier-dev semantic-ci-lint --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mrmps/classifier-dev.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/semantic-ci-lint .gemini/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .gemini/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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 mrmps/classifier-dev semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-lint -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mrmps/classifier-dev.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/semantic-ci-lint .github/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .github/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-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 mrmps/classifier-dev semantic-ci-lint --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mrmps/classifier-dev.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/semantic-ci-lint .opencode/skills/semantic-ci-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 "semantic-ci-lint" agent skill from https://github.com/mrmps/classifier-dev/tree/main/skills/semantic-ci-lint into .opencode/skills/semantic-ci-lint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "semantic-ci-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.
semantic-ci-lintCheck every changed hunk of a pull request against conventions written in prose (naming, error handling, logging, docs) with a keyless classifier, and comment only on findings above a confidence…
Semantic CI Lint is an agent skill from mrmps/classifier-dev. Check every changed hunk of a pull request against conventions written in prose (naming, error handling, logging, docs) with a keyless classifier, and comment only on findings above a confidence threshold. Use when a convention cannot be expressed as a lint rule, when someone says "enforce our conventions in CI" or "check the PR against the style guide", or when the same review comment keeps being typed by hand.
Its SKILL.md is about 1.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 and Pull requests. The repository describes itself as: Zero-shot text classification over plain HTTP — no API key, no account. One Cloudflare Worker, a CLI, and an MCP server. https://classifier.dev. The licence is MIT.
Read from SKILL.md and the folder at commit 629df75. 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:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
classifier.devFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GH_TOKENGITHUB_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Semantic CI Lint loads about 1.5k tokens when it runs. Until then it costs about 108 tokens; SKILL.md has 420 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 mrmps/classifier-dev at commit 629df75, republished under its MIT licence (© mrmps). 420 words, ~1,500 tokens.
.claude/skills/semantic-ci-lint/SKILL.md (or your agent's skills folder)."Log ids, never a person's name" and "never swallow a failure" are rules a team writes down and then enforces by memory. A classifier can check them: one label and a calibrated confidence per hunk, no prose, cheap on every push.
The instructions field carries the convention in your own words; each call
asks about one convention. Four conventions in a single
instructions line put a hunk that logs a person's address and name at
follows the convention 0.27. The same hunk against the logging convention
alone came back breaks the convention, and with the whole hunk and its file
path in the input, 1.0.
Keep three labels: follows, breaks, and the convention does not apply to this hunk - the third stops unrelated hunks being forced into a verdict.
.github/semantic-lint.py reads the output of git diff -U0:
import json, re, sys, urllib.request
CONVENTIONS = [
("logging", "One convention only: a log line may carry ids and counts, never "
"a person's name, address or anything else that identifies them."),
("errors", "One convention only: a failure is raised as a typed error class "
"and is never swallowed by an empty or logging-only catch block."),
]
LABELS = ["follows the convention", "breaks the convention",
"the convention does not apply to this hunk"]
BREAKS, COMMENT_AT, NOTE_AT = LABELS[1], 0.9, 0.5
def hunks(diff):
out, path, buf, line = [], None, [], 0
for raw in diff.splitlines():
if raw.startswith("+++ b/"):
path = raw[6:]
elif raw.startswith("@@"):
if buf: out.append((path, line, "\n".join(buf))); buf = []
m = re.search(r"\+(\d+)", raw)
line = int(m.group(1)) if m else 0
elif raw.startswith("+"):
buf.append(raw[1:])
elif buf:
out.append((path, line, "\n".join(buf))); buf = []
if buf: out.append((path, line, "\n".join(buf)))
return [h for h in out if h[0] and h[2].strip()]
def judge(texts, rule):
req = urllib.request.Request("https://classifier.dev/v1/classify",
data=json.dumps({"labels": LABELS, "instructions": rule,
"inputs": [t[:32000] for t in texts]}).encode(),
headers={"content-type": "application/json", "user-agent": "ci-lint/1"})
return json.load(urllib.request.urlopen(req))["results"]
chunks = hunks(open(sys.argv[1], encoding="utf-8").read())
texts = [f"{p}:{n}\n{t}" for p, n, t in chunks] # whole hunk, with its path
found = []
for name, rule in CONVENTIONS:
for (p, n, _), r in zip(chunks, judge(texts, rule) if texts else []):
if r["label"] == BREAKS and (r["confidence"] or 0) >= NOTE_AT:
found.append((p, n, name, r["confidence"]))
for p, n, name, c in found:
print(f"{'BREAKS' if c >= COMMENT_AT else 'unsure'} {name:8} {p}:{n} {c}")
sure = [f for f in found if f[3] >= COMMENT_AT]
if sure:
with open("comment.md", "w") as f:
f.write("Convention check\n\n")
for p, n, name, c in sure:
f.write(f"- `{p}` line {n}: breaks the **{name}** convention ({c})\n")On a diff that logs a person's details and swallows a refund failure:
BREAKS logging src/api/orders.ts:42 1
BREAKS errors src/api/orders.ts:61 1Against this repository's last three commits, 46 hunks and two conventions, it printed nothing.
name: conventions
on: pull_request
permissions:
contents: read
pull-requests: write
jobs:
conventions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: hunks
run: git diff -U0 ${{ github.event.pull_request.base.sha }}...HEAD > diff.txt
- name: judge
run: python3 .github/semantic-lint.py diff.txt | tee -a $GITHUB_STEP_SUMMARY
- name: comment
if: hashFiles('comment.md') != ''
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr comment ${{ github.event.pull_request.number }} --body-file comment.mdfetch-depth: 0 is required or the base commit is missing from the clone. The
job never fails the build; an advisory job stays switched on.
Comment at 0.9 and above, where answers were right 82 to 92% of the time. Put findings between 0.5 and 0.9 in the job summary, where they cost nobody a notification. Below 0.5, say nothing. A bot that is wrong twice gets muted, so the threshold guards the job more than the diff.
Latency is free in CI, so "tier": "smart" is worth it: it re-asks answers
under 0.7 of a reasoning model. Six hunks took 1.8 seconds with one
escalation, against about 110ms on fast.
Skip conventions a real linter already enforces; eslint and ruff are exact and free. Skip generated files and vendored directories. Where a wrong comment on a pull request costs more than the convention is worth, write to the job summary and drop the comment step.
© mrmps, 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 skills/semantic-ci-lint of mrmps/classifier-dev.
Open the folder on GitHubat commit 629df75
Semantic CI 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 |
|---|---|---|---|---|---|---|
| Semantic CI Lint this skillmrmps/classifier-dev | 424 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Changesetbiomejs/biome | 26k | — | ~839 | Automated safety check: Pass | Apache-2.0 | |
| Pre Pipeline Reviewsuperplanehq/superplane | 7.7k | — | ~1.2k | Automated safety check: Pass | Custom licence | |
| Lint Commit PRTresjs/tres | 3.8k | — | ~1.1k | Automated safety check: Pass | MIT | |
| PR Pushicebear0828/codex-proxy | 1.8k | — | ~2.2k | Automated safety check: Notes | Custom licence |
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.
biomejs/biome
A skill your agent uses when a Biome change may affect users and you must decide whether it needs a changeset, choose the release level, or create and edit .changeset/.md release-note text.
superplanehq/superplane
Reviews SuperPlane code changes for correctness and reuse, then runs fast Make targets (lint, format, build) that Semaphore CI runs so easy checks do not fail in the pipeline.
Tresjs/tres
Lint local changes, auto-fix, conventional commit, and optionally create PR
icebear0828/codex-proxy
Package the current working changes into a standards-compliant codex-proxy pull request: branch hygiene, commit message linting, CHANGELOG prompt, conventional commit, push, and gh pr create against…
icebear0828/codex-proxy
Package the current working changes into a standards-compliant codex-proxy pull request: branch hygiene, commit message linting, CHANGELOG prompt, conventional commit, push, and gh pr create against…
mrmps/classifier-dev
Sort many texts into your own categories without reading them, using a keyless HTTP API that returns a calibrated confidence per answer.
mrmps/classifier-dev
Pick a browser or desktop agent's next action by choosing among the actions actually on screen instead of inventing one.
mrmps/classifier-dev
Check user-generated text against a written policy before it is published.
mrmps/classifier-dev
Label each context chunk keep, drop or replace-with-a-pointer and pass the survivors through byte for byte instead of summarising, with key-shaped chunks decided locally and never sent, and a…
mrmps/classifier-dev
Label each page of an intake packet with a document type and a page role before extraction runs, so only confident pages reach an extractor and the rest reach a person.
mrmps/classifier-dev
Filter hundreds or thousands of headlines, search results or feed items against a written brief before opening any of them, using a two-stage cascade that spends a fast model on everything and a…
Categories
Check every changed hunk of a pull request against conventions written in prose (naming, error handling, logging, docs) with a keyless classifier, and comment only on findings above a confidence…. Semantic CI Lint is an agent skill from mrmps/classifier-dev. Check every changed hunk of a pull request against conventions written in prose (naming, error handling, logging, docs) with a keyless classifier, and comment only on findings above a confidence threshold.
Semantic CI Lint fits situations like: A convention cannot be expressed as a lint rule; someone says enforce our conventions in CI; check the PR against the style guide; the same review comment keeps being typed by hand.
Run `npx skills add mrmps/classifier-dev --skill semantic-ci-lint -a claude-code`. Or copy the skill folder (skills/semantic-ci-lint in mrmps/classifier-dev) into .claude/skills/semantic-ci-lint in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mrmps/classifier-dev --skill semantic-ci-lint -a codex`. Or copy the skill folder (skills/semantic-ci-lint in mrmps/classifier-dev) into .agents/skills/semantic-ci-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 mrmps/classifier-dev --skill semantic-ci-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/semantic-ci-lint, .gemini/skills/semantic-ci-lint, .github/skills/semantic-ci-lint and .opencode/skills/semantic-ci-lint in your project.
Going by SKILL.md and its folder, Semantic CI Lint needs the command-line tools its instructions call (git) and credentials named GH_TOKEN and GITHUB_TOKEN. Our summary lists: Python 3; A credential in GITHUB_TOKEN.
SKILL.md names 1 domain. In commands or code: classifier.dev; the agent is likely to contact it when it follows the instructions. 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.
Semantic CI Lint is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.5k tokens (SKILL.md is roughly 6k 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 Semantic CI Lint: Babysit PR To Pass CI (sgl-project/sglang, 37k stars), Changeset (biomejs/biome, 26k stars), Pre Pipeline Review (superplanehq/superplane, 7.7k stars) and Lint Commit PR (Tresjs/tres, 3.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mrmps (a GitHub user) maintains it in mrmps/classifier-dev, which has 424 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 7, 2026.
Source: mrmps/classifier-dev on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.