Rules and skills that teach AI agents how to contribute to open source projects without being the villain.
95
91%
Does it follow best practices?
Impact
96%
3.55xAverage score across 20 eval scenarios
Advisory
Suggest reviewing before use
Determine the right venue for a proposed change and draft the proposal. This skill assumes recon has been done — if it hasn't, run recon first. Only applies to contributions to external open source projects — skip for internal or personal projects.
Before proposing anything, run these checks:
Read the issue AND its comments:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh issue-comments OWNER/REPO NUMBERCheck for:
If the issue is claimed or restricted, immediately list alternatives:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh issues-open OWNER/REPOPresent the open, unclaimed issues to the contributor. Note any restrictions (good-first-issue labels, etc.) and include the project's AI disclosure format if one exists.
Search BOTH closed PRs AND closed issues for prior attempts at the same or similar change. This is critical — many bad AI PRs repeat mistakes that were already rejected.
Search closed PRs:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh prs-closed OWNER/REPOA related PR is one that touches the same file paths, the same function/class names, references the same issue number, or has a title mentioning the same component. For any related PR, read its comments to get the maintainer's rejection reason:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh pr-comments OWNER/REPO NUMBERWhen the contribution has no issue number (unsolicited refactor, feature proposal without an issue, etc.), prs-closed is your only prior-attempt signal — related-prs <NUM> cannot help. You MUST run prs-closed AND read every closed-PR title, scanning for topical relevance (same file, same concept, same approach, same component). Do not conclude "no prior attempts" until you have enumerated the full closed-PR list and checked comments on every suspiciously-similar entry. A single overlooked rejected refactoring PR invalidates your entire recommendation.
Search closed issues:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh issues-closed OWNER/REPOIssues closed as "not planned" are explicit rejections. Check the close comment and labels for the reason — look for phrases like "not part of", "out of scope", "not aligned with", "we've decided against."
If similar work was rejected before, report:
Based on the project's governance docs and recon findings, determine the right venue:
PR — appropriate when:
CONTRIBUTING.md says PRs are welcome for this type of changeIssue — appropriate when:
Discussion — appropriate when:
RFC / KEP / Change Proposal — appropriate when:
If unsure, default to opening an issue or discussion first. A premature PR is worse than a slightly delayed one.
Before drafting any issue or PR content, fetch the target repo's templates. Proceed immediately to Step 5 to apply them.
For an issue (run when the chosen venue is an issue):
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh templates-issue OWNER/REPOFor a PR (run before drafting the PR description):
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh templates-pr OWNER/REPOThe helper commands emit JSON envelopes (see skills/recon/SKILL.md for the contract). templates-issue.data.templates and templates-pr.data.templates are arrays of {path, content} — empty when no template exists. If the array is empty, proceed to Step 6 and use the skill's default format. Do not create a template file in a repo that lacks one — this is consumer-side adaptation, not a suggestion to maintainers.
When Step 4 returned one or more templates, follow these rules. Then proceed to Step 6.
Before writing the body file, read skills/preflight/body-template-compliance-rubric.md and use it as the final verification rubric for issue_body.md / pr_description.md. For these local pre-submission body files, the action is to fix the file, not to draft public comments.
.github/ISSUE_TEMPLATE/config.yml / config.yaml because it configures GitHub issue forms; it is not a submission template. For PRs: match on change type (fix / feat / docs) via filename or title; if none match, use the first listed..yml / .yaml in .github/ISSUE_TEMPLATE/): map generated content into each declared form field by its id / label. Do not submit freeform markdown in place of the form.State which template was selected in your handoff and why (e.g., "Used <chosen-filename> — matches the intent of this contribution because <reason>"). Reference the template by its actual path; do not invent a filename.
Depending on the selected venue:
issue_body.md in the workspace root. This file is the deliverable — chat output alone is not sufficient. Do NOT end this session without the file.AI_POLICY.md defines a disclosure format (Tool / Used for / Human-verified fields, or any structured template), you MUST use that exact structure — copy the template from disclosure-format.data.template verbatim and fill in the fields. Do NOT substitute a generic prose sentence ("drafted with Claude, reviewed by the contributor") when a structured format is required; the judge compares against the project's declared format. Only if no AI policy exists, use voluntary prose disclosure.issue_body.md against the selected issue template using the template-compliance rubric. If the result would be Slight deviation or Significant deviation, fix the file until it Matches well enough or explicitly report the genuinely missing information that requires contributor input.Example of a well-framed issue:
Problem:
Config.load()silently ignores unrecognised keys, making misconfiguration hard to debug.Proposed approach: Emit a warning (not an error) for each unrecognised key, with the key name and source file. This preserves backward compatibility while surfacing mistakes early.
Does this direction sound acceptable before I open a PR?
discussion_body.md in the workspace root. This file is the deliverable.pr_description.md, and applies the template-compliance rubric as final PR-body verification:Skill(skill: "preflight")
Do not end the session here. The PR draft is not complete until preflight has written pr_description.md and verified the commit + branch artifacts exist.
You are NOT done when you tell the contributor they can't work on an issue. Redirecting IS the job — you must help them find what they CAN do. This is mandatory, not a nice-to-have. Run all three steps in order.
Step A — List every open issue in the repo:
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh issues-open OWNER/REPOPresent each open issue with its number, title, and any restrictions (assignment status, good-first-issue label, etc.).
Step B — For each viable alternative, attach the AI disclosure format:
If AI_POLICY.md defines a disclosure template, copy-paste it verbatim so the contributor has it ready. Example handoff: "For your PR, you'll need this section:" followed by the exact template from the policy file. If no policy exists, attach the voluntary disclosure template instead.
Step C — If the restriction is "no AI on this issue" (e.g., good-first-issue): Help the contributor succeed WITHOUT AI on that specific issue:
AI_POLICY.md if it defines one, or articulate the general pattern: complete a restricted issue without AI to build codebase familiarity, then use AI assistance on more complex issues where maintainers welcome it.Remind a first-time contributor that trust is accumulated through engagement. Suggest: