| name | ttt-triage |
| description | Triage Tiny Tool Town submissions. Reviews new-tool and author-page issues in shanselman/TinyToolTown, evaluates tools against acceptance criteria, queues imports, and helps convert verified author claims into author content files. |
Tiny Tool Town Triage Skill
Triage submissions for Tiny Tool Town — a community directory of free, open-source tiny tools and claimed author pages.
When to Use
Invoke this skill when asked to:
- Triage new issues / submissions
- Review tool submissions
- Approve or reject tools
- Review author-page claims
- Create or update author profile files
- Check what new tools are pending
Tool Submission Triage Workflow
Step 1: Fetch Open Issues
gh issue list --repo shanselman/TinyToolTown --state open --label new-tool --json number,title,body,labels,createdAt --limit 50
Or use the GitHub MCP list_issues tool with state: OPEN on shanselman/TinyToolTown.
Step 2: Evaluate Each Submission
For each issue, assess against all of these criteria and assign a confidence level.
Step 3: Present Triage Table
Output a markdown table with: issue #, tool name, language, license, confidence (HIGH/MEDIUM/LOW), recommendation (APPROVE/REJECT/MAYBE), and notes.
Step 4: Act on Decisions
After the user confirms:
- APPROVE: Label issue with
queued-import (not approved — batch-approve.yml drains the queue)
- REJECT: Close with a polite comment explaining why
- MAYBE: Comment asking for the missing information
Acceptance Criteria
Approve if all of these are true:
- Open source — Has a recognized open-source license (MIT, Apache 2.0, GPL, ISC, BSD, etc.)
- Repo is public and accessible — Not a 404, not archived
- It's actually tiny — Single-purpose, small, focused tool; not a full platform or suite
- It's fun, useful, or delightful — TTT celebrates small, joyful tools
- Not enterprise/commercial — No SaaS, no paid tiers, no enterprise features
- Has a README — Should explain what the tool does
- Checklist is complete — All boxes checked in the submission form
Reject if any of these are true:
- No license — Repo has no LICENSE file and submitter didn't specify one
- Dead repo — 404, archived, or clearly abandoned
- Enterprise/commercial tool — Paid SaaS, enterprise pricing, or "free tier" of a commercial product
- Not a tiny tool — Full platform, framework, or suite
- Spam or low effort — Empty repo, no code, or clearly auto-generated submission
- Duplicate — Tool already exists on the site
Maybe / Request Changes if:
- License unclear — Repo exists but no LICENSE file; ask them to add one
- Borderline scope — Could be tiny or could be too big; use judgment
- CC BY-NC or similar — Non-commercial restriction is acceptable but worth flagging
- Repo looks new/empty — Very few commits, might not be ready yet
Confidence Levels
- HIGH — Clear-cut decision, all criteria met or clearly violated
- MEDIUM — Mostly clear but one minor concern
- LOW — Significant uncertainty or borderline fit
Automated Labels
The submission workflow may add:
repo-verified
has-license
has-readme
has-image
Missing has-image is non-blocking.
Important Operational Notes
GitHub Auth
gh auth switch -u shanselman
Approval Queue
Never label issues with approved directly. Always use queued-import.
The batch-approve.yml workflow is the sole writer and drains the queue.
Follow-up Comments
Before making a final decision, check whether the submitter recently commented that they added a license, fixed the repo, or uploaded an image.
Rejection Comments
Be kind and specific:
Hey @username! Thanks for submitting [tool name] to Tiny Tool Town! 👋
Unfortunately, we can't add this one because [specific reason].
[If fixable]: If you [add a license / trim it down / etc.], feel free to resubmit!
Thanks for thinking of us!
Checking for Duplicates
Get-ChildItem src/content/tools/*.md | Select-String -Pattern "github_url.*owner/repo"
Triage Report Format
## Recommend APPROVE (N tools)
| # | Tool | Language | Confidence | Notes |
|---|------|----------|------------|-------|
| 123 | ToolName | Python | HIGH | Brief reason |
## Maybe / Needs Info (N tools)
| # | Tool | Concern |
|---|------|---------|
| 456 | ToolName | What's needed |
## Recommend REJECT (N tools)
| # | Tool | Reason |
|---|------|--------|
| 789 | ToolName | Why it doesn't fit |
Post-Triage
After approvals are queued, optionally trigger the batch workflow:
gh workflow run batch-approve.yml --repo shanselman/TinyToolTown
Author Page Claim Workflow
Author page claims use the customize-author.yml issue form and are labeled author-page.
Step 1: Fetch Author Claims
gh issue list --repo shanselman/TinyToolTown --state open --label author-page --json number,title,body,labels,author,comments,createdAt --limit 50
Also look for open issues titled [Author] @... that may be missing the label. If an author issue is missing author-page, add that label (create it if necessary) so the validation workflow and future triage can find it.
Step 2: Check Verification Labels
.github/workflows/validate-author-claim.yml validates claims only:
- Runs for issues labeled
author-page and for issues titled [Author] ....
- Backfills the
author-page label when it sees an author claim without the label.
- Adds
claim-verified when the issue author matches the requested GitHub username.
- Adds
invalid-author-claim when the issue author does not match the requested username.
- Comments on missing or mismatched usernames.
Important: this workflow does not create or update files under src/content/authors/. Author file ingress is currently handled by maintainers/agents through normal repo commits or PRs.
Step 3: Evaluate Claim Readiness
Approve/take an author claim only when all are true:
- Claim is verified (
claim-verified) or the issue author clearly matches the requested handle.
- The claimed handle has at least one accepted tool in
src/content/tools/*.md.
- The issue includes useful display content: at minimum a display name plus a short bio or headline.
- Links are normal public profile/project links and use
https://.
- Featured groups reference existing tool slugs when provided.
Request info when:
- The claim has only links and no bio/headline. Claiming would replace the generated summary with a sparse page.
- The requested handle does not have any listed tools yet.
- Featured tool slugs are missing, misspelled, or not clearly intended.
- Links are malformed or unclear.
Reject/close when:
- The claim is invalid and not a special maintainer-approved case.
- The requested username does not match the issue author and no maintainer override is provided.
Step 4: Create or Update Author Files
Author files live in:
src/content/authors/{normalized-github-handle}.md
Schema is defined in src/content.config.ts:
---
github: "handle"
name: "Display Name"
headline: "Short headline"
website_url: "https://example.com"
links:
- label: "Blog"
url: "https://example.com/blog"
notes:
- "Short highlight."
sections:
- title: "Tool group"
description: "What these tools have in common."
toolSlugs:
- "existing-tool-slug"
---
Short bio / intro paragraph.
Guidelines:
- Normalize
github and filename to lowercase without @.
- Keep user-provided voice, but lightly edit for clarity, length, and site fit.
- Prefer
and over & in prose/headlines unless it is part of a brand.
- Do not include empty fields,
_No response_, or placeholder bullets.
- For author
links, parse issue-form lines as Label - https://....
- For
sections, only include groups with valid existing tool slugs.
- If no bio/headline is provided, do not create a file yet; comment asking for one.
Step 5: Validate and Close
For author content changes:
npm test
npm run build
After committing/pushing the author file:
- Close the author issue with a comment referencing the commit.
- If more info is needed, leave the issue open and comment with the specific missing information.
Combined Daily Triage
When asked to triage "everything" or "other issues":
- Fetch both
new-tool and author-page issues.
- Fetch open PRs.
- Queue ready tools with
queued-import.
- Convert ready author claims into
src/content/authors/*.md via commit/PR.
- Request missing author info instead of creating sparse profiles.
- Close or decline stale/superseded PRs only when explicitly authorized.