Set up, understand, and change a Tessl factory on a repository: pick automations that fit how you work, such as shipping tickets as pull requests, answering reviews and fixing checks on those pull requests, code review, and scheduled jobs; prepare the repository for agents; write issues for the factory to build; then see what the factory has done, find out why a run failed or never started, and change or extend it.
92%
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
How to propose a lint rule or test for a candidate routed to lint or test, using the linters and test runner the repository already has.
This version only proposes. Do not enable a rule, edit lint config, add a test, or fix a violation. Enabling a rule across an existing repository produces a very large pull request, so the proposal is the whole output. Lint and test proposals are not items the user picks in step 5, and step 6 applies none of them.
Each section belongs to one step of the skill:
Find what the repository already runs, from two sources:
Record, for each tool: its name, the config path, the projects it covers, and whether CI runs it. A tool configured but never run in CI is a weaker home, so say so.
Find the test runner the same way, for the rules that fit a test better than a lint rule.
If the repository has no linter, propose none. Tell the user in one line that lint-tier candidates have no home, and route them to a test, a verifier, or agent context instead.
For each lint-tier candidate, pick the first that fits:
--max-warnings 0). A local Git hook does not count, because it can be missing on a clone or skipped with --no-verify. Then propose nothing here and handle it as one home per rule says. Otherwise it is a proposal for the change that would make it gate: the options it would need, such as a restricted-imports rule that lists other imports, raising its severity, or adding its linter to CI when only a hook or nothing runs it.Do not propose a new tool. A rule that needs one fails the ladder here and moves to the next tier.
For each proposal, count how many places break the rule today. Count only that rule, not the repository's existing violations of its other rules:
ruff check --select <code>, or take the tool's JSON output and keep only the diagnostics with that rule id.ast-grep scan --inline-rules or semgrep -e.Keep every run read-only. Step 5 has not happened yet, so the repository must not change:
ruff --no-cache or mypy's --cache-dir.new Error( in the files the rule covers: search the tracked files with git grep, and report the count as " by text search; isn't installed". When no search can stand in for the rule, report the count as not measured.git status --porcelain is the same after the run as before it. If it changed, tell the user what the run wrote.Report the count and the number of files and projects it spans, and whether it came from the linter or a text search. If the count cannot be measured, say so and why. Never estimate.
The count tells the user the cost of enabling the rule:
In step 5, show the lint and test proposals as their own group, unnumbered, under the heading "Lint, for your team to decide (not applied)", in the format from routing. Each is one line: the rule, what enforces it (the existing rule, or the custom rule or test that would be written), how many files break it today, and "Seen on". Nothing applies these in this version.
In the pull request body and the closing message, give each lint proposal these lines: