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, propose Code Review lens changes from how the lenses did on recent pull requests, and turn open findings into tickets the factory builds.
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Medium
Suggest reviewing before use
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:
status: succeeded. A window with no findings is not this situation: a bug that got past review is still evidence..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.tessl api "/experimental/projects/<projectId>/code-review-findings?page%5Bsize%5D=100&filter%5Bsince%5D=<ISO date>", paging with page%5Bnumber%5D until meta.total is reached; a page you could not read is a gap in the report. Each row is one finding raised in the window: its pull request number, findingId, title, body, severity, path, line and lensRefs, when it was first raised, and its outcome. For an addressed, refuted or declined finding, settlement.note says why, as the review that settled it recorded the author's answer.lensRefs name, installed outside the repository: 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.
Each row of the findings call is one finding. Per lens in its lensRefs, count it as raised, and as addressed, declined, refuted or still open by its outcome. A row with a mergedIntoFindingId was raised again as part of that finding: count it as raised, and not as still open, since the finding it merged into carries it. 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. "Still open" means no later review has settled it, which includes findings on pull requests that merged without another review.
tessl code review CLI or the GitHub Action are not in it, and this skill does not count them.lensRefs entry names the plugin, version and skill, such as tessl/code-review@0.5.0#review-markdown. A finding with no lens has an empty lensRefs. Severity is critical, major, minor or nit..tessl-code-review.yml on its default branch is reviewed with the default lenses, which the findings' lensRefs 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 pull request URLs and Code Review 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; how many findings were read, across how many pull requests; 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.launch-result.json at the clone root. Use status: succeeded with a summary of two to four plain sentences: the window, how many Code Review findings were read across how many pull requests, 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.