OSS Contribution README Skill
Also apply the shared OSS contribution quality protocol in
../../references/contribution-quality.md
for source-of-truth checks, evidence, and public artifact quality. This skill's
README-specific rendering and portfolio rules override the shared protocol when
they conflict.
Purpose
Create a public-facing README that accurately presents a contributor's
open-source history. Optimize for correctness, clean rendering on GitHub,
durable links, visible logos, and text that can be reused in LinkedIn or a
personal portfolio.
Execution Guardrails
- Verify before claiming. Confirm PR, patch, star, fork, and tenure numbers
from public sources or the user's supplied tracker output before writing them.
- Keep public artifacts clean. Do not include private tool names,
generated-by notes, hidden workflow details, or agent provenance in the
README, commit messages, branch names, or public prose.
- Use durable links. Prefer official project URLs, GitHub repos, Apache logo
service assets, project docs, or official organization avatars. Avoid fragile
image search URLs and expiring assets.
- Design for screenshots. Keep table labels short, use compact logos,
avoid crowded prose inside a single cell, and switch to HTML tables when
Markdown wrapping makes logo/name pairs look bad.
- Do not inflate status. Count merged PRs only when GitHub or the upstream
tracker shows acceptance. Closed alone is not merged, but repository-specific
landing bots may close an accepted PR without populating GitHub's
mergedAt.
- Respect mixed contribution types. If GitHub PRs and tracker patches are
combined, use neutral wording such as "Contributions" in prose and explain
the mix only when needed.
Inputs, Outputs, and Preconditions
| Type |
Content |
| Inputs |
Contributor name, GitHub username, target README path, project list, optional tracker URLs, preferred intro wording, optional featured projects |
| Outputs |
README.md contribution sections (Skippy repo) or standalone README.md (profile/showcase repos) with intro, contribution matrix, linked logos, verified counts, totals, and optional featured contribution table |
| Evidence |
Count commands or source URLs, earliest contribution date for tenure claims, logo source links, git diff --check result |
Preconditions:
gh is authenticated when GitHub counts need live verification.
- The user supplies non-GitHub tracker URLs or enough detail to find them.
- Network access is available for current counts, logos, stars, forks, or docs.
Workflow Overview
Use this ordered workflow unless the user asks for a narrow edit:
- Gather identity and scope.
- Verify GitHub and tracker contribution counts.
- Verify tenure or impact claims.
- Select project links and logos.
- Build or update the README tables.
- Check rendering risks, totals, and link targets.
- Validate, commit, and push when requested.
Step 1: Gather Scope
Capture or infer:
- Display name and GitHub username.
- README target, usually a profile repo or standalone showcase repo.
- Projects to include in the main matrix.
- Non-GitHub contribution systems such as JIRA, Bugzilla, mailing-list patches,
or project-specific trackers.
- Featured projects that need more context than counts, such as creator role,
ecosystem listing, tech stack, stars/forks, or problem solved.
- Sorting preference: project name by default, or count descending when the user
wants an impact-ranked table.
If the target repo should contain only a README, do not add generated data files,
screenshots, caches, or scripts unless the user explicitly asks.
Step 2: Verify Counts
Do not rely on visual GitHub page counts alone. Use gh or the GitHub app.
For a GitHub repo:
gh pr list --repo OWNER/REPO --author USERNAME --state all --limit 1000 \
--json number,state,mergedAt,labels,url,title,createdAt
Count:
PRs Created: all returned PRs for that author in that repo.
Open PRs: PRs with state == "OPEN".
Merged PRs: PRs with non-null mergedAt, plus PRs accepted through a
verified repository-specific landing workflow.
PyTorch is a known exception to the classic GitHub merge signal. PyTorchBot
lands approved changes and closes the source PR, so mergedAt can remain null.
For pytorch/pytorch, count a closed PR as merged when it carries the Merged
label and the timeline contains PyTorch merge-bot landing evidence. Verify the
label and bot comments or landed commit before counting it; do not treat every
closed PyTorch PR as merged.
For a contributor-wide earliest public PR:
gh search prs --author USERNAME --sort created --order asc --limit 20 \
--json repository,number,title,createdAt,state,url
Use this to verify claims such as "more than a decade." As of the current date,
the earliest verified public contribution must be at least 10 years old. If the
evidence is exactly near the boundary, state the exact date instead of rounding.
For non-GitHub trackers:
- Use the tracker query URL supplied by the user when possible.
- Count visible submitted tickets or patches from that query.
- Link the count to the query or issue list.
- Track open and merged/accepted status only when the tracker exposes it.
- If a tracker uses terms like
OPEN, RESOLVED, FIXED, or CLOSED, map
them carefully and say when a status is not equivalent to GitHub merged.
Step 3: Choose Logos and Links
Use this priority order:
- Official project site or docs logo.
- Official repo asset on the default branch.
- Foundation logo service, especially Apache
https://apache.org/logos/res/....
- Official GitHub organization avatar.
- Text-only project link when no clear logo is available.
Rules:
- Link the project name to the official project site or repository.
- Link the count cell to the contributor PR list or tracker query.
- Use
height="18" for logos in tables unless the user asks for larger visuals.
- Add descriptive
alt text, for example Apache Hadoop logo.
- If a white logo disappears on GitHub's white background, use a dark variant,
icon-only variant, official avatar, or text-only fallback.
- Avoid underlined-looking custom CSS; GitHub strips most CSS anyway. Use normal
links and let the platform render them.
Compact Markdown table cell:
<a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">Project</a>
No-wrap HTML table cell when logo and text split across lines:
<td nowrap="nowrap" width="180"><a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">project-name</a></td>
Step 4: Write the README
Recommended intro:
# Open Source Contributions
I have been contributing to open source for more than a decade. Every
contribution is a chance to learn something new and collaborate with amazing
communities.
Name's GitHub handle: [username](https://github.com/username)
Main matrix:
## Contribution Matrix
| Project | PRs Created | Open PRs | Merged PRs |
|---------|-------------|----------|------------|
| <a href="https://github.com/apache/hadoop"><img src="LOGO" alt="Apache Hadoop logo" height="18"></a> <a href="https://github.com/apache/hadoop">Apache Hadoop</a> | [13](https://github.com/apache/hadoop/pulls/username) | 10 | 3 |
| **Total PRs** | **13** | **10** | **3** |
When the matrix includes tracker patch submissions, either:
- Rename the section to
Open Source Contributions, or
- Add one short sentence before the table that says the matrix includes GitHub
PRs and tracker-based patch submissions.
Do not over-explain obvious columns. Avoid long definitions such as "PRs Created
means PRs created" in the README.
Step 5: Add Featured Contributions
Use a separate featured/additional table for projects where the story matters
more than PR counts. This avoids crowding the main matrix.
Preferred columns:
| Column |
Use |
| Project |
Logo plus linked project name |
| Ecosystem |
Parent ecosystem, community listing, marketplace, docs, or announcement |
| Role |
Creator, maintainer, contributor, architect, reviewer |
| Problem Solved |
One concrete problem the project or contribution addressed |
| Tech Stack |
Short comma-separated list |
| Metrics |
Stars, forks, downloads, adoption, merged status, or other public metrics |
Use an HTML table for this section when it has many columns:
<table>
<thead>
<tr>
<th>Project</th>
<th>Ecosystem</th>
<th>Role</th>
<th>Problem Solved</th>
<th>Tech Stack</th>
<th>Metrics</th>
</tr>
</thead>
<tbody>
<tr>
<td nowrap="nowrap" width="180"><a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">project-name</a></td>
<td><a href="ECOSYSTEM_URL"><img src="ECOSYSTEM_LOGO" alt="Ecosystem logo" height="18"></a> <a href="ECOSYSTEM_URL">Ecosystem</a></td>
<td>Creator, architect, maintainer</td>
<td>NVIDIA GPU observability through <code>nvidia-smi</code> / NVML metrics shipped into Elasticsearch.</td>
<td>Go, Elastic Beats, Elasticsearch, NVIDIA SMI/NVML, Python</td>
<td>56 stars, 18 forks</td>
</tr>
</tbody>
</table>
Keep featured rows factual. If a role ended at a previous employer, use wording
like "creator, architect, and maintainer while at Company" only when the user
wants the employment context included.
Step 6: LinkedIn Copy
When the user asks for a LinkedIn caption, write short, warm prose. Mention
current focus areas only when relevant:
I have been contributing to open source for more than a decade. Every
contribution is a chance to learn something new and collaborate with amazing
communities.
Lately, my focus has been around the AI ecosystem, including OpenClaw, NemoClaw,
Inspect AI, Inspect Petri, Hermes Agent, and PyTorch.
#OpenSource #AI #MachineLearning #PyTorch #InspectAI #OpenClaw
Do not add inflated claims, unverifiable impact, or a long project dump unless
the user asks.
Step 7: Validate and Finish
Before finalizing:
git diff --check -- README.md
Also check:
- Counts match the latest verified data.
- Totals equal the visible rows.
- Project names link to official sites or repos.
- Count cells link to contributor PR lists or tracker queries.
- Logos render on a white background.
- Logo/name pairs stay readable and do not wrap awkwardly.
- Featured project cells are split into columns instead of one crowded sentence.
- Public text contains no private tool attribution or generated-by language.
If working in the Skippy repo and the user wants the update published, commit only
the README.md contribution table sections and directly related skill/template
files. For other target repos, commit only README.md and directly related
files. Leave unrelated dirty files untouched.
Publishing rule: requests such as "update contributions", "update the
contribution matrix", and "refresh contribution counters" mean update the
## Skippy-Assisted Contributions and ## Non-Skippy Contributions sections
in README.md after validation.
Quick Reference
| Task |
Command or Rule |
| List author PRs in one repo |
gh pr list --repo OWNER/REPO --author USER --state all --limit 1000 --json number,state,mergedAt,labels,url |
| Find earliest public PR |
gh search prs --author USER --sort created --order asc --limit 20 --json repository,number,title,createdAt,state,url |
| GitHub contributor link |
https://github.com/OWNER/REPO/pulls/USER |
| Logo size |
height="18" |
| Default sort |
Project name ascending |
| Validation |
git diff --check -- README.md plus visual/render inspection |
| Publish Skippy update |
Update contribution sections in README.md, commit, then push |
1---2name: oss-contribution-readme3description: Create or update a polished contribution matrix with linked project names, official logos, verified PR or patch counts, open and merged status, optional featured-project details, and LinkedIn-ready intro copy. Use when the user wants to update contribution counts in README.md, refresh the OSS matrix, refresh contribution counters, create a GitHub profile README, standalone OSS portfolio repo, contribution table with logos, public PR counts, tracker patch submissions, featured project table, or reusable open-source contribution showcase.4---56# OSS Contribution README Skill78Also apply the shared OSS contribution quality protocol in9[../../references/contribution-quality.md](../../references/contribution-quality.md)10for source-of-truth checks, evidence, and public artifact quality. This skill's11README-specific rendering and portfolio rules override the shared protocol when12they conflict.1314## Purpose1516Create a public-facing README that accurately presents a contributor's17open-source history. Optimize for correctness, clean rendering on GitHub,18durable links, visible logos, and text that can be reused in LinkedIn or a19personal portfolio.2021## Execution Guardrails2223- **Verify before claiming.** Confirm PR, patch, star, fork, and tenure numbers24 from public sources or the user's supplied tracker output before writing them.25- **Keep public artifacts clean.** Do not include private tool names,26 generated-by notes, hidden workflow details, or agent provenance in the27 README, commit messages, branch names, or public prose.28- **Use durable links.** Prefer official project URLs, GitHub repos, Apache logo29 service assets, project docs, or official organization avatars. Avoid fragile30 image search URLs and expiring assets.31- **Design for screenshots.** Keep table labels short, use compact logos,32 avoid crowded prose inside a single cell, and switch to HTML tables when33 Markdown wrapping makes logo/name pairs look bad.34- **Do not inflate status.** Count merged PRs only when GitHub or the upstream35 tracker shows acceptance. Closed alone is not merged, but repository-specific36 landing bots may close an accepted PR without populating GitHub's `mergedAt`.37- **Respect mixed contribution types.** If GitHub PRs and tracker patches are38 combined, use neutral wording such as "Contributions" in prose and explain39 the mix only when needed.4041## Inputs, Outputs, and Preconditions4243| Type | Content |44| --- | --- |45| Inputs | Contributor name, GitHub username, target README path, project list, optional tracker URLs, preferred intro wording, optional featured projects |46| Outputs | `README.md` contribution sections (Skippy repo) or standalone `README.md` (profile/showcase repos) with intro, contribution matrix, linked logos, verified counts, totals, and optional featured contribution table |47| Evidence | Count commands or source URLs, earliest contribution date for tenure claims, logo source links, `git diff --check` result |4849Preconditions:5051- `gh` is authenticated when GitHub counts need live verification.52- The user supplies non-GitHub tracker URLs or enough detail to find them.53- Network access is available for current counts, logos, stars, forks, or docs.5455## Workflow Overview5657Use this ordered workflow unless the user asks for a narrow edit:58591. Gather identity and scope.602. Verify GitHub and tracker contribution counts.613. Verify tenure or impact claims.624. Select project links and logos.635. Build or update the README tables.646. Check rendering risks, totals, and link targets.657. Validate, commit, and push when requested.6667## Step 1: Gather Scope6869Capture or infer:7071- Display name and GitHub username.72- README target, usually a profile repo or standalone showcase repo.73- Projects to include in the main matrix.74- Non-GitHub contribution systems such as JIRA, Bugzilla, mailing-list patches,75 or project-specific trackers.76- Featured projects that need more context than counts, such as creator role,77 ecosystem listing, tech stack, stars/forks, or problem solved.78- Sorting preference: project name by default, or count descending when the user79 wants an impact-ranked table.8081If the target repo should contain only a README, do not add generated data files,82screenshots, caches, or scripts unless the user explicitly asks.8384## Step 2: Verify Counts8586Do not rely on visual GitHub page counts alone. Use `gh` or the GitHub app.8788For a GitHub repo:8990```bash91gh pr list --repo OWNER/REPO --author USERNAME --state all --limit 1000 \92 --json number,state,mergedAt,labels,url,title,createdAt93```9495Count:9697- `PRs Created`: all returned PRs for that author in that repo.98- `Open PRs`: PRs with `state == "OPEN"`.99- `Merged PRs`: PRs with non-null `mergedAt`, plus PRs accepted through a100 verified repository-specific landing workflow.101102PyTorch is a known exception to the classic GitHub merge signal. PyTorchBot103lands approved changes and closes the source PR, so `mergedAt` can remain null.104For `pytorch/pytorch`, count a closed PR as merged when it carries the `Merged`105label and the timeline contains PyTorch merge-bot landing evidence. Verify the106label and bot comments or landed commit before counting it; do not treat every107closed PyTorch PR as merged.108109For a contributor-wide earliest public PR:110111```bash112gh search prs --author USERNAME --sort created --order asc --limit 20 \113 --json repository,number,title,createdAt,state,url114```115116Use this to verify claims such as "more than a decade." As of the current date,117the earliest verified public contribution must be at least 10 years old. If the118evidence is exactly near the boundary, state the exact date instead of rounding.119120For non-GitHub trackers:121122- Use the tracker query URL supplied by the user when possible.123- Count visible submitted tickets or patches from that query.124- Link the count to the query or issue list.125- Track open and merged/accepted status only when the tracker exposes it.126- If a tracker uses terms like `OPEN`, `RESOLVED`, `FIXED`, or `CLOSED`, map127 them carefully and say when a status is not equivalent to GitHub merged.128129## Step 3: Choose Logos and Links130131Use this priority order:1321331. Official project site or docs logo.1342. Official repo asset on the default branch.1353. Foundation logo service, especially Apache `https://apache.org/logos/res/...`.1364. Official GitHub organization avatar.1375. Text-only project link when no clear logo is available.138139Rules:140141- Link the project name to the official project site or repository.142- Link the count cell to the contributor PR list or tracker query.143- Use `height="18"` for logos in tables unless the user asks for larger visuals.144- Add descriptive `alt` text, for example `Apache Hadoop logo`.145- If a white logo disappears on GitHub's white background, use a dark variant,146 icon-only variant, official avatar, or text-only fallback.147- Avoid underlined-looking custom CSS; GitHub strips most CSS anyway. Use normal148 links and let the platform render them.149150Compact Markdown table cell:151152```html153<a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">Project</a>154```155156No-wrap HTML table cell when logo and text split across lines:157158```html159<td nowrap="nowrap" width="180"><a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">project-name</a></td>160```161162## Step 4: Write the README163164Recommended intro:165166```markdown167# Open Source Contributions168169I have been contributing to open source for more than a decade. Every170contribution is a chance to learn something new and collaborate with amazing171communities.172173Name's GitHub handle: [username](https://github.com/username)174```175176Main matrix:177178```markdown179## Contribution Matrix180181| Project | PRs Created | Open PRs | Merged PRs |182|---------|-------------|----------|------------|183| <a href="https://github.com/apache/hadoop"><img src="LOGO" alt="Apache Hadoop logo" height="18"></a> <a href="https://github.com/apache/hadoop">Apache Hadoop</a> | [13](https://github.com/apache/hadoop/pulls/username) | 10 | 3 |184| **Total PRs** | **13** | **10** | **3** |185```186187When the matrix includes tracker patch submissions, either:188189- Rename the section to `Open Source Contributions`, or190- Add one short sentence before the table that says the matrix includes GitHub191 PRs and tracker-based patch submissions.192193Do not over-explain obvious columns. Avoid long definitions such as "PRs Created194means PRs created" in the README.195196## Step 5: Add Featured Contributions197198Use a separate featured/additional table for projects where the story matters199more than PR counts. This avoids crowding the main matrix.200201Preferred columns:202203| Column | Use |204| --- | --- |205| Project | Logo plus linked project name |206| Ecosystem | Parent ecosystem, community listing, marketplace, docs, or announcement |207| Role | Creator, maintainer, contributor, architect, reviewer |208| Problem Solved | One concrete problem the project or contribution addressed |209| Tech Stack | Short comma-separated list |210| Metrics | Stars, forks, downloads, adoption, merged status, or other public metrics |211212Use an HTML table for this section when it has many columns:213214```html215<table>216 <thead>217 <tr>218 <th>Project</th>219 <th>Ecosystem</th>220 <th>Role</th>221 <th>Problem Solved</th>222 <th>Tech Stack</th>223 <th>Metrics</th>224 </tr>225 </thead>226 <tbody>227 <tr>228 <td nowrap="nowrap" width="180"><a href="PROJECT_URL"><img src="LOGO_URL" alt="Project logo" height="18"></a> <a href="PROJECT_URL">project-name</a></td>229 <td><a href="ECOSYSTEM_URL"><img src="ECOSYSTEM_LOGO" alt="Ecosystem logo" height="18"></a> <a href="ECOSYSTEM_URL">Ecosystem</a></td>230 <td>Creator, architect, maintainer</td>231 <td>NVIDIA GPU observability through <code>nvidia-smi</code> / NVML metrics shipped into Elasticsearch.</td>232 <td>Go, Elastic Beats, Elasticsearch, NVIDIA SMI/NVML, Python</td>233 <td>56 stars, 18 forks</td>234 </tr>235 </tbody>236</table>237```238239Keep featured rows factual. If a role ended at a previous employer, use wording240like "creator, architect, and maintainer while at Company" only when the user241wants the employment context included.242243## Step 6: LinkedIn Copy244245When the user asks for a LinkedIn caption, write short, warm prose. Mention246current focus areas only when relevant:247248```text249I have been contributing to open source for more than a decade. Every250contribution is a chance to learn something new and collaborate with amazing251communities.252253Lately, my focus has been around the AI ecosystem, including OpenClaw, NemoClaw,254Inspect AI, Inspect Petri, Hermes Agent, and PyTorch.255256#OpenSource #AI #MachineLearning #PyTorch #InspectAI #OpenClaw257```258259Do not add inflated claims, unverifiable impact, or a long project dump unless260the user asks.261262## Step 7: Validate and Finish263264Before finalizing:265266```bash267git diff --check -- README.md268```269270Also check:271272- Counts match the latest verified data.273- Totals equal the visible rows.274- Project names link to official sites or repos.275- Count cells link to contributor PR lists or tracker queries.276- Logos render on a white background.277- Logo/name pairs stay readable and do not wrap awkwardly.278- Featured project cells are split into columns instead of one crowded sentence.279- Public text contains no private tool attribution or generated-by language.280281If working in the Skippy repo and the user wants the update published, commit only282the `README.md` contribution table sections and directly related skill/template283files. For other target repos, commit only `README.md` and directly related284files. Leave unrelated dirty files untouched.285286Publishing rule: requests such as "update contributions", "update the287contribution matrix", and "refresh contribution counters" mean update the288`## Skippy-Assisted Contributions` and `## Non-Skippy Contributions` sections289in `README.md` after validation.290291## Quick Reference292293| Task | Command or Rule |294| --- | --- |295| List author PRs in one repo | `gh pr list --repo OWNER/REPO --author USER --state all --limit 1000 --json number,state,mergedAt,labels,url` |296| Find earliest public PR | `gh search prs --author USER --sort created --order asc --limit 20 --json repository,number,title,createdAt,state,url` |297| GitHub contributor link | `https://github.com/OWNER/REPO/pulls/USER` |298| Logo size | `height="18"` |299| Default sort | Project name ascending |300| Validation | `git diff --check -- README.md` plus visual/render inspection |301| Publish Skippy update | Update contribution sections in `README.md`, commit, then push |