external-campaign-triage
Skill2 starsChanged 2 months agoMITView on GitHub
Track state across many candidate issues, PRs, and repos in a multi-repo external open-source contribution campaign, using a local tracker instead of GitHub labels. Use when scouting, claiming, implementing, or following up across many third-party repos in an ongoing campaign, and always before posting any status-check comment on a stalled external PR.
In this repository31 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- ai-agent-pr-metadataSkill
- changesets-releaseSkill
- clarify-workSkill
- decompose-to-issuesSkill
- define-doneSkill
- design-composition-checkSkill
- diagnoseSkill
- docker-db-guardrailsSkill
- docker-volume-guardrailsSkill
- external-pr-styleSkill
- external-pr-viabilitySkill
- git-guardrails-claude-codeSkill
- git-identity-guardSkill
- hitl-blockerSkill
- open-code-review-setupSkill
- release-gateSkill
- resolving-merge-conflictsSkill
- review-gateSkill
- subagent-pipelineSkill
- tmux-orphaned-socketSkill
- to-prdSkill
- vps-cleanupSkill
- wizardSkill
- workflow-routerSkill
- write-prompt-guideSkill
- writing-for-agentsSkill
- cavemanSkill
- handoverSkill
- roastSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 4 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 53
Never post a second "checking in" or "following up" comment on the same PR.
- Distinctive: line 54
Never state an exact elapsed day count in the comment itself (e.g.
- Very specific: line 55
After that single follow-up, set the record's state to stalled_awaiting_maintainer and stop nudging it.
- Very specific: line 56
Never wire follow-up comments into an automated periodic reminder loop.
- Distinctive: line 62
Before claiming, check the tracker for an existing non-terminal record on the same candidate to avoid duplicate work across concurrent …
- Distinctive: line 65
If the PR goes quiet, apply the Maintainer Follow-Up Guardrail before doing anything else.
- Very specific: line 70
Never apply a picked by agent or agent:* GitHub label to a repo we don't own or collaborate on — the tracker record is the only claim …
- Very specific: line 73
Do not skip viability_checked to save time — an unvetted candidate wastes the same implementation effort external-pr-viability exists to …
- Very specific: line 74
Do not delete or rewrite history entries.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
External Campaign Triage
Use this for a campaign tracker repo (e.g. open-source-tracker) running many concurrent candidate issues/PRs across third-party repos we don't own. ai-agent-pr-metadata's picked by agent / agent:<model>-<effort>-<role> label convention only works on repos we own or collaborate on; it cannot be applied to someone else's issue or PR. This skill defines the state machine and metadata that replace it: JSON records in the tracker repo, not upstream labels.
State machine
Each candidate moves through these states, recorded in the tracker, never skipped backward:
scouted → viability_checked → claimed → implementing → in_review → merged | abandoned | stalled_awaiting_maintainer | silenced
scouted: a candidate issue/repo identified, not yet vetted.viability_checked:external-pr-viabilityran; only proceed past this state if it passed.claimed: an agent has started work. Check the tracker for an existingclaimed/implementing/in_reviewrecord on this candidate before starting — the tracker file is the source of truth for "already picked" since no GitHub label exists to signal it.implementing: code, tests, and PR draft in progress, followingsubagent-pipelineroles.in_review: PR opened (external-pr-stylefor the description) and awaiting maintainer response.stalled_awaiting_maintainer: reached only through the Maintainer Follow-Up Guardrail below. Terminal until a maintainer responds; never re-entered from itself.merged/abandoned: terminal, normal outcomes.silenced: terminal, reached whenever a maintainer responds negatively to any contact (see Guardrails).
Tracker record
One JSON record per candidate:
{
"id": "owner-repo-issue-123",
"repo": "owner/repo",
"url": "https://github.com/owner/repo/issues/123",
"state": "in_review",
"history": [
{"state": "scouted", "at": "2026-09-01T10:00:00Z", "role": "scout", "model": "sonnet5-medium"},
{"state": "viability_checked", "at": "2026-09-01T10:20:00Z", "role": "scout", "model": "sonnet5-medium"},
{"state": "claimed", "at": "2026-09-01T11:00:00Z", "role": "implementer", "model": "sonnet5-medium"},
{"state": "in_review", "at": "2026-09-02T09:00:00Z", "role": "implementer", "model": "sonnet5-medium"}
],
"maintainer_contact": {"follow_ups_sent": 0, "last_follow_up_at": null, "maintainer_response": null},
"silenced": false
}Every state transition appends a history entry with role (scout / implementer / reviewer / fixer, mirroring subagent-pipeline's roles) and the resolved model — the same traceability ai-agent-pr-metadata records as an agent:<model>-<effort>-<role> label, kept as tracker-JSON metadata here because there is no upstream label surface to write it to. Don't assume this exact schema matches the live open-source-tracker repo's own field names; check its current schema before writing to it.
Maintainer follow-up guardrail (critical)
Real incident: two unrelated third-party maintainers responded with hostile pushback after receiving a second "just checking in" comment on their own open PR with no prior maintainer response — one said to stop chasing PRs as a last warning, the other said time is a gift, not something people are entitled to. Treat this as a standing constraint, not a style preference:
- Send at most one polite status-check comment per stalled PR, and only after 10 or more days of maintainer silence since the PR was opened or last touched by a maintainer.
- Never post a second "checking in" or "following up" comment on the same PR. One touch, then silence and patience are the default.
- Never state an exact elapsed day count in the comment itself (e.g. "it's been 8 days"). Precise counts are what make a message read as bot-generated even when a human typed it — say "it's been a while" or similar instead.
- After that single follow-up, set the record's state to
stalled_awaiting_maintainerand stop nudging it. Do not re-check or re-comment on a fixed schedule. - Never wire follow-up comments into an automated periodic reminder loop. Only escalate a specific stalled candidate when a human explicitly asks for that specific escalation (then use
hitl-blockerif the escalation itself needs a human-held action). - If a maintainer responds negatively to any contact (asks to stop, expresses annoyance), record the response verbatim in
maintainer_contact.maintainer_response, setstatetosilencedandsilenced: true, and treat that maintainer as silenced org-wide, not just repo-wide: the same person commonly maintains several repos in the same org, and a maintainer annoyed on one repo is the same maintainer on the others. Apply the silence to every repo in that maintainer's org, not only the one where the pushback happened — no further unsolicited comments to that maintainer anywhere in the org, ever. This mirrors thesilenced_repos.jsonconvention already used inopen-source-tracker— check that repo's current schema before writing to it, don't assume this skill's field names match it exactly.
Workflow
- Scout a candidate; run
external-pr-viabilitybefore writing any code. Recordscoutedthenviability_checked. - Before claiming, check the tracker for an existing non-terminal record on the same candidate to avoid duplicate work across concurrent agents.
- Record
claimed, then run the implementation throughsubagent-pipeline's cold-start roles, updatinghistoryat each role handoff. - Open the PR with
external-pr-style; recordin_review. - If the PR goes quiet, apply the Maintainer Follow-Up Guardrail before doing anything else.
- On merge, close-without-merge, or a negative maintainer response, record the terminal state and stop touching that candidate.
Guardrails
- Never apply a
picked by agentoragent:*GitHub label to a repo we don't own or collaborate on — the tracker record is the only claim mechanism here. - When this tracker's own PR/commit (against the campaign repo) references a third-party PR/issue, never write the unbroken
owner/repo#123pattern (or a fullgithub.comURL) in the PR title, body, or commit message — both forms trigger a public "mentioned this pull request" cross-reference on the target's timeline, exposing the campaign tool. Seeai-agent-pr-metadata's cross-reference-leak guidance for the confirmed-safe forms (inline code backticks in PR/issue bodies; a broken adjacency likerepo PR #123in commit messages). This only applies to what you type into a PR/issue/commit-message field — a tracker markdown/JSON file's own content is not scanned for cross-references. - See
subagent-pipeline's Guardrails section (the "Public issues, PRs, comments, and handovers..." bullet) for the parallel credential-redaction discipline that applies to every public comment this skill causes an agent to post. - Do not skip
viability_checkedto save time — an unvetted candidate wastes the same implementation effortexternal-pr-viabilityexists to avoid. - Do not delete or rewrite
historyentries; append only. The tracker is an audit trail, not a status field to overwrite. - Concurrency ceiling: Maintain a recommended maximum of 3 open external PRs (
in_review) per third-party repository, not a total across the whole campaign — a healthy multi-repo campaign will legitimately have far more than 3 open PRs in aggregate. Submitting more than 3 simultaneous unsolicited PRs into any single repository dramatically increases the likelihood of being flagged as an automated spammer by that project's maintainers or platform abuse detection. Space new PRs into the same repo (and the same org, since a maintainer's patience is often org-wide, not repo-scoped — see the Maintainer Follow-Up Guardrail) rather than opening all 3 at once.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

