Skills that Learn from past work loops run: review pull request history for agent context and Tessl verifier improvements, read recent agent runs to record recurring problems as project findings, and propose Code Review lens changes from how the lenses did on recent pull requests.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Tessl Code Review reviews this repository's pull requests with lenses: skill files that each review some of the files for one kind of problem. A lens that keeps raising findings authors decline costs review rounds and trust, and a lens that misses a kind of bug lets it reach the default branch. Find those patterns in the evidence and record each as a Tessl finding that proposes one concrete change. The project's people decide what to do with each finding. Prefer zero findings to weak ones.
A report and launch-result.json saying what you read, the counts per lens, each finding you recorded, and each pattern you looked at and did not record, with why. Every finding you recorded proposes one change and cites the evidence behind it.
Take the first situation that applies, do its next action, and look again:
run:v1 marker. Record nothing; report that there was nothing to read, with status: succeeded..tessl-code-review.yml, and no finding tagged adopt-lenses is open, in progress or ignored. Record the adoption finding, as Adopting the lenses says.launch-result.json, as Report says.If what you find fits none of these, say what you found in the report and stop.
.local/tune-review-lenses/, and nothing else. Change no repository file, push nothing, open no pull request and post no comment. Changes to review policy are the owner's to make.code-review-lens that is open, in progress or ignored. Revisit a resolved one only when its pattern has come back since it was resolved, and say so in its analysis.adopt-lenses is open, in progress or ignored.Read .cloud-launch/inputs.json and require UUID orgId and projectId. Get the current UTC time with a tool. Look back 14 days; an optional lookbackDays input (integer 1 to 60) replaces the 14. Always count over the whole window, even when you recorded a finding recently: a pattern builds over weeks, and a shorter window would never reach the threshold. What an existing finding already cites is not new evidence for it. Take the repository from git remote get-url origin as owner/name.
.tessl-code-review.yml at the root of the default branch, if any. Its lenses entries say which lens (ref) reviews which files (globs, in order, ! excluding), and ignore lists files no lens reviews. A ref starting ./ is the repository's own copy and can be edited here; any other ref comes from the registry and cannot be.gh pr list --state all --search "updated:>=<date>" --limit 1000 --json number,url,state,mergedAt; when it returns 1000, say the list was capped. For each, read the inline review comments (gh api repos/<owner>/<repo>/pulls/<n>/comments --paginate) and the reviews (gh api repos/<owner>/<repo>/pulls/<n>/reviews --paginate). Keep the comments and reviews Code Review wrote: they carry the markers below.tessl api "/experimental/projects/<projectId>/code-review-settled-findings?page%5Bsize%5D=100&filter%5Bsince%5D=<ISO date>", paging with page%5Bnumber%5D until meta.total is reached. Add &filter%5Bcategory%5D=addressed to also see what was addressed, and page that query to its own meta.total too; a query you could not page to the end is a gap in the report. Each row gives the pull request number, the category, the settling note, and the finding's title, severity, path, line and lensRefs.mkdir -p /tmp/lenses && cd /tmp/lenses && git init -q && tessl install <workspace>/<plugin>@<version> --yes --agent claude-code, then read under .tessl/plugins/ (the agent named only decides where the files are linked). Its code-review skill's references/repository-profile.md describes the profile and how to route lenses.AGENTS.md, CLAUDE.md, .tessl/RULES.md) and the documents they point to: a declined finding that cites one of these decisions is strong evidence that a lens does not know it.tessl finding list --project <projectId> --tag code-review-lens --limit 100 --json, following links.next until it is absent, and tessl finding view <id> --json for likely matches.Write every tessl api path with its query string URL-encoded, as above. If a read fails, say which in the report and carry on with what you have.
For each finding Code Review raised in the window, take its ID from finding:v1, its lenses from lenses:v1, and its severity from the first bold line, **<Severity> · ...**. Findings appear in inline comments and, when they could not be placed on a line, inside the review body under "Findings outside changed lines"; count each finding ID once. Then take its outcome from the latest reconciliation:v1 reply carrying that ID. Per lens, count raised, addressed, declined, refuted, and still open (raised, with no settling reply yet). A finding raised by several lenses counts once for each, so the per-lens totals add up to more than the number of findings; say so wherever you give them. When a settled-findings row and a reply disagree, use the settled-findings row and note the disagreement.
tessl code review CLI published it:
<!-- tessl-code-review:run:v1 --> in the body of every review it publishes, including one with no findings.<!-- tessl-code-review:result:v1 approved=<bool> findings-total=<n> findings-unplaced=<n> --> in the review body.<!-- tessl-code-review:lenses:v1 refs=<refs> --> then <!-- tessl-code-review:finding:v1 id=<id> --> at the end of every finding, inline or in the review body. refs is a comma-separated list, each entry URL-encoded, such as tessl%2Fcode-review%400.5.0%23review-markdown for tessl/code-review@0.5.0#review-markdown. A finding with no lens has neither the lenses marker nor its label.<!-- tessl-code-review:reconciliation:v1 id=<earlier finding id> category=<category> --> at the start of a line in a reply on an earlier finding's thread. The categories are addressed, refuted, declined, remaining and regressed; the last two mean the finding still stands.Critical, Major, Minor or Nit..tessl-code-review.yml on its default branch is reviewed with the default lenses, which the markers name with their plugin and version. Once a profile exists there, a pull request from an author with write access, or from a GitHub App, is reviewed with that pull request's own copy of the profile and lenses; other authors get the default branch's copy.tessl code review --profile ./.tessl-code-review.yml --base <commit>~1 --head <commit> --json reviews one commit with a profile and prints one JSON document whose status is ok, failed or skipped; on ok, outcome.lenses lists the lenses it used.tessl finding create --project <projectId> --file <payload.json> --json. The payload has schemaVersion: 1; nonempty title, analysis, recommendation and expectedImprovement; exactly one observations entry with observedAt and a nonempty evidence array of strings; and up to 20 tags. Omit loopId and runId; the service fills them in from the run. A run that does not belong to a Loop in the project cannot create findings.tessl finding update <id> --file <payload.json> --json whose payload holds only one observations entry. A run cannot change a finding's state or text.What counts as a pattern:
Not a pattern: one-off disagreements, findings that were addressed, and anything about how the code was written rather than what the lens asked for.
When the repository has no profile, the evidence still says which default lens is noisy. Put the edits it supports in the adoption finding's recommendation as the first edits to make after the copy, or record them as their own findings that say they apply once the lenses are adopted.
When a pattern points at a registry lens in a repository that has a profile, propose copying that one lens in first, with the edit.
Before writing, compare the pattern with the existing findings by problem, not title. When an open or in-progress finding already covers it, add one observation with the new evidence instead.
title: the lens and the change, under 100 characters, for example ": weigh against the scale the repository states".analysis: the pattern with its counts (for example "6 of 9 findings from since declined, each citing "), two to four quoted examples with their pull request, and why the lens produces them, quoting its own text.recommendation: the edit, concretely: which file, which section of the lens, and the sentence to add, change or remove. For routing, the globs to change.expectedImprovement: what should change in the counts, such as fewer declined findings from that lens, or the missed kind of bug caught.observations: one, with observedAt now and evidence the comment URLs and settled-finding IDs you relied on.tags: ["code-review-lens", "<lens name>"].If creating findings is refused, put the full text of each finding you would have recorded in the report and say so.
.local/tune-review-lenses/report.md: the window; the pull requests read; per lens, raised, addressed, declined, refuted and still open; each finding recorded or updated, with its ID and title; each pattern looked at and not recorded, with why; each open finding tagged code-review-lens whose change is already on the default branch, with the commit or pull request that made it, since a run cannot resolve it and a person has to; and every read that failed or was capped.launch-result.json at the clone root. Use status: succeeded with a summary of two to four plain sentences: the window, how many pull requests and Code Review findings were read and how many of those findings were in review bodies rather than inline, the counts per lens, each finding recorded or updated by title, or that none met the bar, and each open finding that looks done. Use status: failed with a one-sentence summary and the concrete reason when the inputs, the reads or the finding writes could not complete.