Contribute
You've got a link. This skill takes it from there.
Orchestrates an end-to-end open-source contribution: from a bare issue or pull request link all the
way to an opened PR, with no manual gates in between once the work itself checks out.
It reads the issue like a maintainer would. Then it fixes it, tests it, and opens a PR you don't have to babysit.
Delegates rendered issue/PR intake to browser intake (rendered read via /ego-browser preferred, browser subagent fallback per references/issue-intake.md)
and deep analysis/review to /multi-agents. Nothing here is tied to one project,
one host, or one language - the pipeline shape is fixed, everything else is detected
fresh each run.
Purpose
Help you earn trust with a PR that is easy to merge.
Give it an issue link. It sends back a small fix with a test and proof. It pings you only when it must.
That's the bar. Small diff. Real proof. Kind tone.
Act with full ownership
A trusted human contributor doesn't pitch a plan and wait for a nod before opening their
editor - they read the issue, understand the codebase, and get to work, looping in a
maintainer only when something is genuinely ambiguous or high-stakes. Once steps 1-5 have
given you that same footing, hold yourself to the same standard. The checkpoints later in
this skill are the complete list of moments worth a pause - routine calls a competent
contributor makes independently (which test file to extend, whether a helper deserves its
own file, commit styling) are yours to make, not questions to surface. Put the reasoning in
the commit and PR description, where it actually benefits reviewers.
The same standard applies to everything posted publicly: see references/human-voice.md
before writing any comment, issue text, or PR content. No public text gets pushed or posted
until its Rule 6 self-check passes. Write in plain B2 English, casual and short, like a senior
engineer who fixed one thing. Never in high-formal, buzzword-laden, em-dash-filled prose.
Maintainers are busy volunteers. They merge work they can read fast.
Keep the diff small. Show what you ran and that it passed. Credit prior tries. Keep it short so they can say yes fast.
When to Use
- User shares an issue or pull request URL from GitHub, GitLab, Gitea, etc., paired with intent to work on it ("start this issue", "let's fix", "pick up this ticket", "here's the next one")
- User mentions a local
contributions/ directory or asks to begin an open-source task
- User requests opening a bug fix or feature PR against an external upstream repository
- User wants an end-to-end autonomous contributor pipeline that doesn't halt for routine micro-decisions
What "done" looks like from the user's side
Just this:
"Here's the next one: <issue-or-pr-url>. Repo's in contributions/."
That's a complete invocation. The skill infers the rest, checks whether the ground has
already been covered by someone else, and - once it's confident the work is solid - pushes
and opens the PR itself. It only interrupts you at the explicit checkpoints listed below.
Inputs
- Required: one URL to an issue or PR. Parse it generically - host, owner/org, repo
name, number - rather than assuming GitHub. GitHub -> use
gh for structured
fields. GitLab -> use glab for structured fields. Anything else -> detect via
browser intake (preferred) or web_fetch/web_search against the web UI.
Host detection never changes the intake rule. Read the issue body and comments rendered
in browser intake per references/issue-intake.md, on every host.
- Inferred when not stated:
- Local repo path - check in this order: (a) a path the user just mentioned, (b)
~/contributions/<repo>, (c) ~/code/contributions/<repo>, (d) ./contributions/<repo>
in the current workspace, (e) a case/dash/underscore-insensitive fuzzy match across
those roots. Nothing found -> ask once whether to clone into ~/contributions/<repo>
(default) or elsewhere. Don't silently clone - it's the one setup step worth a
question.
- Issue vs. PR - tell from the URL shape (
/issues/ vs /pull/ or /merge_requests/)
or from fetched metadata.
- Agent roles for step 7 - default to the three-role brief below; only scale up for
genuinely large issues (see "Scaling the agent brief").
External skills this depends on
Blocking-required - the pipeline stops without this:
- Browser intake (steps 3-4, blocking gate via
/ego-browser preferred, browser subagent fallback) - the ONLY accepted way to read the
issue/PR. Open the live rendered page as a maintainer would see it and capture:
(a) title, body, labels, assignees, state, reactions/priority signals;
(b) the FULL comment thread including collapsed/hidden comments, review threads,
and the "linked pull requests" sidebar;
(c) every visual asset - screenshots, attached images, video/GIF, pasted rich
media - viewed at full resolution, with what each one actually shows written down;
(d) every external URL in body/comments (repro repos, CodeSandbox/StackBlitz,
live demos, docs, videos, sibling-repo issues/PRs) - followed and summarized;
(e) cross-references into sibling repos in the same org.
Follow the exact protocol in references/issue-intake.md and produce its intake
artifact before touching code. gh issue view / glab / web_fetch supply
structured fields (state, timeline, assignees) as a complement - they NEVER replace
the rendered read, because linked-PR sidebars, reactions, images, and external
repro content do not come through cleanly as text.
- Attempt a rendered read first, every run:
/ego-browser preferred, browser subagent / Playwright fallback per references/issue-intake.md.
CLI-only is permitted only as a logged exception after a failed rendered attempt, with the intake artifact recording the attempted method, the exact error, and an explicit VISUALS: UNVERIFIED flag. Never infer VISUALS: NONE from CLI text alone.
- If no browser tool can launch, or the page fails to load and no fallback renders it:
STOP. Tell the user plainly what failed and what resolves it (e.g. install/enable the skill, log in for a
private repo, paste the exact error), and wait. A
gh-only read is not an
acceptable substitute for this gate.
- Opencode / generic agents: invoke it the way this environment loads skills
(slash-command, Skill tool, or
ego-browser nodejs heredoc per its SKILL.md).
Adapt only the invocation format, never the content bar: full thread + visuals
- external links, every run.
Required with graceful solo fallback:
/multi-agents (steps 7 and 10) - runs the three-role analysis/review brief. See
references/multi-agent-brief.md for the exact shape to hand it. If it isn't installed,
or there's no subagent-spawning tool at all in this environment, don't let the pipeline
stall waiting for it - read the brief yourself and work through the three roles in order
(Root-Cause Analyst, then Codebase & Convention Researcher, then - held back until step
10 - Senior Maintainer Reviewer) inside your own reasoning instead. You lose the
independence of a separate pass doing it this way, so be honest in the reviewer role
rather than rubber-stamping your own work - reread that role's "OUTPUT EXPECTED" in the
brief and hold your diff to it as if someone else had written it.
If the call shape either skill actually expects (flags, JSON, a fixed slot count) differs
from what's described here, adapt the format to match its real interface but keep the
content and roles intact. If you're ever unsure how one wants to be invoked, ask the user
to paste its SKILL.md once rather than guessing.
Optional companions - reach for these when the situation calls for it, not as a checklist
to run through every time:
code-review - lends its correctness/security/maintainability/performance/testing
checklist to the Senior Maintainer Reviewer role in step 10, so the review has real
structure behind it instead of a vague "looks fine."
jev-decisions (references/jev-decisions.md) - optional jev_review
MCP gate for steps 4, 7, and 10. Scalar scores + confidence with
previousEvaluation deltas instead of a chatty "looks good". Never writes
code, never replaces tests. Skipped entirely when JEV_API_KEY is not
configured.
documentation - for a change that touches public APIs, config, or commands, keeps
README/CHANGELOG/API docs in sync with the diff instead of leaving them stale.
project-architecture - for a cross-cutting or large-feature issue, works out module
boundaries before step 8 instead of improvising structure mid-implementation.
Workflow
1. Parse the link
Extract host, owner, repo, and number. Everything downstream reads from what's detected
here - don't hardcode to whichever project you saw last.
2. Locate and sync the local clone
- Find the repo using the inference order above.
git remote -v to see the actual remote setup (a fork workflow usually has origin =
the user's fork, upstream = the real project). Add upstream from the parsed
owner/repo if the fix needs to sync against it and it's missing.
- If
origin isn't something you'll actually be able to push to later - it points at the
upstream project itself rather than a fork, and you don't have write access - don't wait
until step 11 to find that out. Fork it now (gh repo fork / glab repo fork, run with
no arguments from inside the clone): both rename the existing origin to upstream and
add the new fork as origin automatically, so there's somewhere to push when the time
comes.
- Detect the real default branch (
main, master, develop, ...) - don't assume main.
git fetch the right remote, check out the default branch, pull.
- If there are uncommitted local changes, stop and ask rather than stashing - that
work may matter to the user.
3. Read the issue or PR (BLOCKING - browser intake only)
Run this inside browser intake per references/issue-intake.md (/ego-browser preferred, browser subagent fallback). Do not start it via
gh issue view alone, and do not treat the first screen as the whole read.
- Open the exact URL the user shared in a dedicated browser task space
(e.g.
contribute-issue-<number>). Wait for load, capture snapshotText(),
and scroll/expand until the full thread is visible - including collapsed,
"show more", "load more", and resolved review threads.
- Capture structured state as a complement (
gh/glab: state, labels,
assignees, timeline), but the rendered read is the record of truth. A
maintainer's clarifying comment outranks the original issue body.
- Inventory and OPEN every visual asset: screenshots, drag-dropped images,
attachments, GIF/video. View each at full resolution (follow its link or
screenshot it), and write down what it proves - error text, broken UI state,
expected vs. actual - not just "has screenshot". An unread image is an
incomplete read.
- Inventory and FOLLOW every external URL in the body and comments - repro repo,
branch, commit, CodeSandbox/StackBlitz/CodePen, live demo, docs page, video,
log paste, sibling issue/PR. Open each in the same task space, note what it
contains and whether it still loads. Mark dead links as dead; never silently
ignore them.
- Pull out the problem statement, repro steps, acceptance criteria, and how
labels change scope (bug vs. feature vs. good-first-issue). Quote maintainer
direction verbatim for the step 7 brief.
- Write the intake artifact (title, thread summary, visual inventory, external-link
inventory, related-work leads) exactly as
references/issue-intake.md defines.
Steps 4, 6, and 7 MUST NOT start until it exists. If the issue body is thin
after all of this, say so explicitly - Agent A in step 7 reproduces from the
visuals/repro link rather than the text.
4. Check for related work and duplicates (still inside browser intake)
Before writing anything, find out if this ground has already been covered, using
the rendered context from step 3 - not title search alone:
- Look at the "linked pull requests" sidebar from step 3 for anything already tied to this
issue.
- Search the issue/PR body and comments for references to other issues or PRs - including
ones in sibling repos in the same org (a monorepo-adjacent project like
sveltejs/svelte + sveltejs/kit cross-references constantly; don't assume the fix
lives only in the repo the issue was filed against).
- Use browser intake to open any candidate PR(s) you find and read their actual status and
review history, not just their title. Follow cross-repo references in the browser
too - a fix that started in a sibling repo reads differently in rendered review
comments than in a timeline API dump.
- Branch on what you find:
- Already merged and it closes this issue - stop, tell the user it looks resolved
already (with the link), and check whether the original issue should have been closed
or whether some part of it is still open.
- An open PR already addresses it well - don't open a competing one. Summarize its
approach to the user and ask whether to review/improve that PR instead, or move to a
different issue.
- A stale or explicitly rejected prior attempt - use browser intake to read why it
stalled or was rejected (maintainer review comments are the ground truth here), and
carry that reasoning into the brief in step 7 so the new attempt doesn't repeat it.
- Nothing found - proceed normally.
- Optional Jev gate: if a Jev key is configured, run Gate A from
references/jev-decisions.md on the candidate-PR evidence. It advises only;
the branches above still decide.
5. Learn the project's own conventions before touching code
Read whatever exists, in priority order: CONTRIBUTING.md / .github/CONTRIBUTING.md,
CODE_OF_CONDUCT.md, .github/PULL_REQUEST_TEMPLATE.md, .github/ISSUE_TEMPLATE/,
docs/DEVELOPMENT.md, the dev-setup section of the root README.md, and lint/format/commit
configs (.eslintrc*, .editorconfig, rustfmt.toml, .pre-commit-config.yaml,
commitlint.config.*). See references/ecosystem-detection.md for the language ->
build/test/lint command lookup so you're not guessing npm test on a Rust repo. This step
is never skippable, even for a one-line fix - it's what stops a good fix from getting
bounced for a style nit instead of the actual code.
6. Create a working branch
Name it per the project's own stated convention if step 5 turned one up; otherwise
fix/<issue-number>-<short-slug> or feat/<issue-number>-<short-slug>. Branch off the
freshly-synced default branch from step 2, never off a stale local branch.
7. Delegate deep analysis to /multi-agents
Once steps 3-5 give real context (not before - a vague brief produces vague agent output),
run /multi-agents with a three-role brief (or work the same brief solo, wearing each hat
in turn - see "External skills this depends on" above - if it isn't available). The brief's
Shared Context Block MUST include the step 3 intake artifact verbatim - thread quotes,
visual-asset findings, and external-link findings - plus step 4 and step 5 context, so
subagents never re-derive or silently drop what the browser already proved. Read
references/multi-agent-brief.md before your first call - it has the full template,
including where the step 4 findings go, and a worked example so the roles come out sharp
instead of generic. In short, the default roles:
- Root-Cause Analyst - reproduces the bug (or nails the exact functional gap for a
feature ask) and traces it to the actual responsible lines. Diagnoses; doesn't fix yet.
- Codebase & Convention Researcher - deep-searches the repo for the files the fix
will touch, prior art (similar past PRs/commits), the conventions gathered in step 5,
and which existing tests already cover this area.
- Senior Maintainer Reviewer - held back until step 10; reviews a real diff, not the
issue. Simulates a maintainer of this specific project, applying the same
correctness/security/maintainability/performance/testing lens as the
code-review
skill (use it directly if it's available) against the actual stated standards from
step 5, rather than generic best practice.
Hand each agent the issue/PR content from step 3, the related-work findings from step 4
(especially any rejected prior approach to avoid repeating), and the conventions from
step 5 directly - they shouldn't have to re-fetch what's already gathered.
- Optional Jev gate: if a Jev key is configured, run Gate B from
references/jev-decisions.md on the analysis. Implement only when it passes;
otherwise loop the roles once, then escalate instead of coding on a guess.
8. Implement
Using Agent A's root cause and Agent B's research as the spec, make the change. Keep the
diff as small as the issue actually requires - note unrelated cleanup opportunities
separately instead of folding them in. Act like a senior earning trust, not a beginner
proving range: one issue, one minimal fix, existing patterns reused. If this is your first
contribution to this repo, prefer the smallest scope that truly closes the issue over a
wider refactor, even when the refactor looks tempting.
9. Verify locally
Run the project's actual test/lint/build commands (from step 5 /
references/ecosystem-detection.md), never assumed generic ones. Add or update a test for
the change - a fix with no accompanying test is one of the most common reasons maintainers
request changes. Re-run the full suite, not just the new test, to catch regressions.
10. Maintainer-style review
Send the real diff (not the plan) to the Senior Maintainer Reviewer role from step 7. Have
it check, against this project's own conventions: correctness, test coverage, style/lint
cleanliness, commit hygiene, whether it actually closes the issue as scoped, and anything a
maintainer would flag (missing docs, breaking-change risk, unhandled edge cases). Every
finding that points at code must cite a commit-pinned permalink per
references/permalink-evidence.md, never a bare path:line on the default branch.
Loop
steps 8 -> 10 until it passes or you hit three rounds; if it still isn't converging, stop
and bring the disagreement to the user instead of pushing something unresolved.
- Optional Jev gate: if a Jev key is configured, run Gate C from
references/jev-decisions.md on the diff + test results BEFORE the reviewer
loop. approve goes to the reviewer; revise fixes and re-asks once;
escalate or low confidence stops. The reviewer role and the three-round cap
still apply on every path.
11. Commit, push, and open the PR - automatically, but never past the Voice Gate
This step has a hard gate inside it. The push is automatic once the gate passes;
it never skips the gate to stay automatic.
- 11.0 Read the voice rules first. Before drafting anything public, read
references/human-voice.md in full and pull this repo's own last 5 to 6 merged
PR titles and bodies (gh pr list --state merged --limit 10 or the
browser-intake equivalent). Your title, body, and any comments must match their
length, casing, and issue-link style. Generic templates lose to repo reality
every time.
- 11.1 Draft small. Pick the template from
references/pr-template.md by diff
size: tiny (1 to 2 sentences, no headers), small (3 to 6 sentences, no headers
unless the repo template forces them), medium (repo headers only). Never more
bullet lines than changed lines. When the text points at code, use a commit-pinned
permalink plus a short verbatim snippet per references/permalink-evidence.md.
Write in B2 casual English with at least one
contraction in anything over 2 sentences. Zero em dashes (—), zero en dashes (–)
as pauses, zero bare -- pauses in prose. Backticked flags like --config are
fine; English pauses are not.
- 11.2 Commit message per the project's own convention (Conventional Commits -
fix: ... / feat: ... - by default, unless step 5 turned up something else).
Keep the subject to one thing, short, same casing as merged PRs.
- 11.3 Run the Voice Gate self-check from
references/human-voice.md Rule 6
literally (banned-word grep, banned-phrase grep, dash grep, plus the eye checklist:
one-thing title, length matches diff, contraction present, proof line with real
command and result, Closes #N once for PR descriptions (skipped for replies and
comments unless closing an issue), no headers/checklists/emoji unless the repo
template demands them). Rewrite until every check passes. A failing draft does not
get pushed "and fixed later".
- 11.4 Confirm the git identity first. Check
git config --get user.name /
git config --get user.email in this clone. It must resolve to the actual person
submitting the contribution, not a default identity a coding-agent install may have
set globally. If it isn't clearly a real person's identity, stop and ask rather than
guessing or silently overwriting it.
- **11.5 Never add a "Co-authored-by," "Generated by," or similar signature crediting an AI tool
to the commit or PR body unless the project's own CONTRIBUTING.md or PR template
explicitly asks for that disclosure. If it does ask, answer it honestly - don't leave the
field blank or mark it false to get past a policy written specifically to catch that.
Absent an explicit ask, the commit should just read as the submitting contributor's own
work, because the review, testing, and judgment behind it were theirs.
- 11.6 Push and open the PR only after 11.0 to 11.3 pass. Once step 10 passes and
the Voice Gate passes, push to the user's fork (the one confirmed or created back in
step 2) and open the PR without waiting for a further go-ahead - that's what end-to-end
automation means here. Draft the PR description from
references/pr-template.md, filled
in with what actually changed, how it was tested, Closes #<issue-number> (or whatever
phrasing this project's own template used in step 5), and a mention of any stale/rejected
prior attempt from step 4 if one existed. The same gate covers every follow-up push and
every review reply or issue comment: re-run the self-check on the new text before posting.
If the gate still fails after three rewrites, stop and bring the draft to the user
instead of pushing it anyway.
- If
gh/glab isn't authenticated, or the push fails for any other reason, say so
plainly and tell the user what to run (gh auth login, etc.) - never report a PR as
opened when it wasn't. This is the one place a fabricated link would actually mislead
someone, so treat it as a hard rule rather than a judgment call.
- The two exceptions that still stop and ask instead of proceeding: step 4 found an
existing PR that already resolves this (see step 4's branches), step 10 never
converged after three rounds, or the Voice Gate in 11.3 still fails after three
rewrites. A rejected voice draft never gets pushed to "fix later".
12. Hand off
Give CI a few minutes and check it once (gh pr checks --watch or the platform
equivalent) before calling this done - not to babysit it through days of human review, but
because a red build from something the local run in step 9 couldn't catch (a CI-only lint
rule, an OS or version you don't have locally) is worth one honest look, and one follow-up
commit if the fix is quick, rather than leaving the user to discover it later. If it's
still red after that look, or just slow to start, don't loop on it - note the status in
the summary and move on.
One short summary: what the issue was, what changed, what was tested, and the branch/PR
link. Don't re-paste the whole diff - the user just watched it happen.
Constraints
These keep your PR mergeable. They guard review time, not just code.
- Do NOT proceed without rendered issue intake (
references/issue-intake.md). Attempt a rendered read first, every run. A raw CLI dump is a complement, never a substitute.
- Do NOT bypass the Human Voice Gate (
references/human-voice.md). Zero banned AI buzzwords, zero em dashes, zero en dashes as prose pauses, and zero speculative fluff.
- Do NOT interrupt the user for routine decisions. File naming, helper extraction, and test placement are your responsibility. Pause ONLY at the explicit checkpoints.
- Do NOT open competing PRs if step 4 finds an existing active or merged PR that resolves the problem.
- Do NOT cite a bare
path:line on the default branch in public text (references/permalink-evidence.md). Pin it to a commit SHA and quote the lines verbatim, after verifying the SHA exists.
- Do NOT push unverified code. Always execute the project's actual build, lint, and test suites (
references/ecosystem-detection.md) before pushing.
- Do NOT add AI disclosure signatures ("Co-authored-by: AI", "Generated by...") unless the target repository's
CONTRIBUTING.md or PR template explicitly mandates it.
- Do NOT guess git author identity. Always verify
git config user.name and user.email represent the authentic contributor before committing.
- Do NOT touch or stash uncommitted changes in the user's local clone without explicit confirmation.
- Done means: tests and lint pass locally, one new or updated test covers the fix, Voice Gate Rule 6 passes, PR links
Closes #N once, CI gets one check in step 12.
Checkpoints (the only points that stop and ask)
Pre-flight safety gates:
- Uncommitted local changes found in step 2 -> ask, don't stash.
- No local clone found -> ask before cloning, and confirm the path.
- Git identity in step 11 isn't clearly the real submitter -> ask, don't guess.
Integrity gates (auto-retry 3x, ask only on failure):
- Browser intake gate fails (no browser tool, page won't render, auth wall, visuals or external repro link unreadable) -> stop and resolve before any code work.
Never silently downgrade to a gh-only read to stay moving.
- Voice Gate in step 11 still fails after three rewrites -> stop and show the draft to the
user instead of pushing it anyway.
Stop-work gates:
- Step 4 finds an existing merged/strong-open PR that already resolves the issue -> stop
and tell the user instead of opening a competing one.
- Step 10's review doesn't converge after three rounds -> stop and flag instead of pushing
anyway.
Everything else - reading files, running /multi-agents,
running tests, iterating on the diff, committing, pushing, and opening the PR - proceeds
straight through without asking, by design. The browser intake gate and the Voice
Gate are part of "straight through": they run every time, they just don't ask, they
complete (intake artifact exists / voice self-check passes) before moving on.
Scaling the agent brief
The three-role default fits most single-issue contributions. Adjust only when the issue
genuinely calls for it:
- Trivial fix (typo, one-line logic bug, clear repro) - merge Analyst and Researcher
into one role; go straight to a light review.
- Cross-cutting or multi-file feature - add a fourth Docs/Changelog Agent (or hand
this to the
documentation skill directly) so README/CHANGELOG/API-doc updates aren't
an afterthought.
- Continuing someone else's PR (not a fresh issue) - swap Root-Cause Analyst for a
PR State Analyst: what's already done, what review feedback is still unresolved.
- A stale/rejected prior attempt turned up in step 4 - give the Root-Cause Analyst that
attempt's rejection reasoning up front so the new pass doesn't re-propose the same thing.
Three well-briefed agents beat five thin ones - only add roles the issue actually needs.
Works with any project, any language
Nothing above is specific to any one repo, host, or language. Step 1 detects the host,
step 5 detects the project's conventions, and references/ecosystem-detection.md detects
the toolchain. Step 4's sibling-repo awareness means it also isn't limited to looking in
just the one repo the issue happened to be filed in. The pipeline shape is the only fixed
part; everything else is discovered fresh on every run.
Examples
Example 1 - Straightforward fix, no checkpoints hit
"Here's the next one: https://github.com/expressjs/express/issues/1234. Repo's in
contributions/."
- Parses the URL; finds
~/contributions/express already cloned with origin = fork,
upstream = expressjs/express; syncs main.
- Runs the blocking intake in browser intake - full thread, linked-PR sidebar empty,
one attached screenshot opened at full size confirming the null-route stack, no
external repro link; writes the intake artifact. A maintainer comment points at
the null check in
lib/router/route.js; no prior attempts.
- Checks
CONTRIBUTING.md and the lint config, branches fix/1234-route-null-check.
- Runs the three-role brief: Root-Cause Analyst lands on
route.js:38, Researcher points
at the existing test pattern in test/Route.js.
- Implements the guard, adds a test, runs the suite and linter, sends the diff through the
Reviewer role - approved on the first pass.
- Commits, pushes to the fork, opens the PR from the template, watches CI turn green, and
hands off with a three-line summary and the PR link.
Every decision here, from branch name to commit message, was already answered by the
brief and the project's own conventions - nothing needed a check-in.
Example 2 - Duplicate work found, checkpoint hit
"Pick up https://gitlab.com/some-org/some-app/-/issues/88."
- Locates and syncs the clone, opens the issue.
- Step 4 turns up an open, approved MR (
!142) that already closes it, just awaiting
merge.
- Stops: "Issue #88 already has an approved, unmerged MR (!142) that closes it - want me
to review/improve that one instead, or move to a different issue?"
Opening a second PR here would hand the maintainer two competing fixes to reconcile - this
is exactly what the checkpoint exists for, not a failure of nerve elsewhere in the pipeline.
Example 3 - Thin issue, /multi-agents unavailable, agent adapts
"start this issue: https://github.com/foo/cli-tool/issues/9 - contributions/"
- The issue is one line - "crashes on --verbose" - no repro, no comments. The
blocking intake still runs in browser intake: full thread scrolled to footer,
VISUALS: NONE - verified rendered, external links NONE - recorded in the intake artifact as gaps.
/multi-agents isn't installed here. Rather than stalling, works the brief solo:
reproduces the crash first (Analyst hat), traces it to an unguarded .split() on
undefined output, then switches to the Researcher hat to find the existing
flag-parsing tests.
- Implements the fix and a regression test, runs the suite.
- Reviews its own diff wearing the Reviewer hat as if it were someone else's PR, catches
that
--verbose --json together still crashes, and fixes that too before moving on.
- Opens the PR, noting that the original issue was thin and the repro was reconstructed
from the stack trace, so a maintainer can sanity-check the interpretation.
Adapting to what's actually available beats stalling to ask the user to install something
they may not know they're missing.
Reference files
references/issue-intake.md - BLOCKING intake protocol for steps 3-4: how to drive
browser intake (task space, full-thread scroll, visual-asset handling, external-URL
handling), the intake artifact shape, and the stop-conditions. Read before opening
the issue URL. No intake artifact, no code.
references/human-voice.md - BLOCKING for any public-facing text (issue comment,
PR description, merge request comment, review reply, status update). Read it before
drafting, match this repo's own merged PRs, write in B2 casual English, and run its
Rule 6 self-check until it passes. Do not push or post while it fails. This is what
keeps the contribution from being closed on sight as generated text.
references/multi-agent-brief.md - exact brief template + worked example for step 7,
including where step 4's related-work findings go.
references/ecosystem-detection.md - language/build-tool detection and command lookup
for steps 5 and 9.
references/jev-decisions.md - optional Jev calibrated gates for steps 4, 7, 10:
typed questions, thresholds, provider priority, and the decision-log learning loop.
references/pr-template.md - PR description template for step 11.
references/permalink-evidence.md - commit-pinned permalink protocol for every
code citation in public text (steps 10-11): how to build the link, the snippet
format, and the SHA check. Bare path:line drifts; permalinks do not.
1---2name: contribute3description: Use this skill to contribute via GitHub/GitLab/Gitea issue/PR links — fixing bugs, implementing features. Triggers on "start this issue", "pick up this ticket", contributions dir, or open-PR requests. Uses ego-browser intake and multi-agents review before push.4---56# Contribute78> You've got a link. This skill takes it from there.910Orchestrates an end-to-end open-source contribution: from a bare issue or pull request link all the11way to an opened PR, with no manual gates in between once the work itself checks out.12It reads the issue like a maintainer would. Then it fixes it, tests it, and opens a PR you don't have to babysit.13Delegates rendered issue/PR intake to browser intake (rendered read via `/ego-browser` preferred, browser subagent fallback per `references/issue-intake.md`)14and deep analysis/review to `/multi-agents`. Nothing here is tied to one project,15one host, or one language - the pipeline shape is fixed, everything else is detected16fresh each run.1718## Purpose1920Help you earn trust with a PR that is easy to merge.2122Give it an issue link. It sends back a small fix with a test and proof. It pings you only when it must.2324That's the bar. Small diff. Real proof. Kind tone.2526### Act with full ownership2728A trusted human contributor doesn't pitch a plan and wait for a nod before opening their29editor - they read the issue, understand the codebase, and get to work, looping in a30maintainer only when something is genuinely ambiguous or high-stakes. Once steps 1-5 have31given you that same footing, hold yourself to the same standard. The checkpoints later in32this skill are the *complete* list of moments worth a pause - routine calls a competent33contributor makes independently (which test file to extend, whether a helper deserves its34own file, commit styling) are yours to make, not questions to surface. Put the reasoning in35the commit and PR description, where it actually benefits reviewers.36The same standard applies to everything posted publicly: see `references/human-voice.md`37before writing any comment, issue text, or PR content. No public text gets pushed or posted38until its Rule 6 self-check passes. Write in plain B2 English, casual and short, like a senior39engineer who fixed one thing. Never in high-formal, buzzword-laden, em-dash-filled prose.4041Maintainers are busy volunteers. They merge work they can read fast.4243Keep the diff small. Show what you ran and that it passed. Credit prior tries. Keep it short so they can say yes fast.4445## When to Use4647- User shares an issue or pull request URL from GitHub, GitLab, Gitea, etc., paired with intent to work on it ("start this issue", "let's fix", "pick up this ticket", "here's the next one")48- User mentions a local `contributions/` directory or asks to begin an open-source task49- User requests opening a bug fix or feature PR against an external upstream repository50- User wants an end-to-end autonomous contributor pipeline that doesn't halt for routine micro-decisions5152### What "done" looks like from the user's side5354Just this:5556> "Here's the next one: `<issue-or-pr-url>`. Repo's in contributions/."5758That's a complete invocation. The skill infers the rest, checks whether the ground has59already been covered by someone else, and - once it's confident the work is solid - pushes60and opens the PR itself. It only interrupts you at the explicit checkpoints listed below.6162## Inputs6364- **Required:** one URL to an issue or PR. Parse it generically - host, owner/org, repo65 name, number - rather than assuming GitHub. GitHub -> use `gh` for structured66 fields. GitLab -> use `glab` for structured fields. Anything else -> detect via67 browser intake (preferred) or `web_fetch`/`web_search` against the web UI.68 Host detection never changes the intake rule. Read the issue body and comments rendered69 in browser intake per `references/issue-intake.md`, on every host.70- **Inferred when not stated:**71 - *Local repo path* - check in this order: (a) a path the user just mentioned, (b)72 `~/contributions/<repo>`, (c) `~/code/contributions/<repo>`, (d) `./contributions/<repo>`73 in the current workspace, (e) a case/dash/underscore-insensitive fuzzy match across74 those roots. Nothing found -> ask once whether to clone into `~/contributions/<repo>`75 (default) or elsewhere. Don't silently clone - it's the one setup step worth a76 question.77 - *Issue vs. PR* - tell from the URL shape (`/issues/` vs `/pull/` or `/merge_requests/`)78 or from fetched metadata.79 - *Agent roles for step 7* - default to the three-role brief below; only scale up for80 genuinely large issues (see "Scaling the agent brief").8182## External skills this depends on8384**Blocking-required - the pipeline stops without this:**8586- **Browser intake** (steps 3-4, blocking gate via `/ego-browser` preferred, browser subagent fallback) - the ONLY accepted way to read the87 issue/PR. Open the live rendered page as a maintainer would see it and capture:88 (a) title, body, labels, assignees, state, reactions/priority signals;89 (b) the FULL comment thread including collapsed/hidden comments, review threads,90 and the "linked pull requests" sidebar;91 (c) every visual asset - screenshots, attached images, video/GIF, pasted rich92 media - viewed at full resolution, with what each one actually shows written down;93 (d) every external URL in body/comments (repro repos, CodeSandbox/StackBlitz,94 live demos, docs, videos, sibling-repo issues/PRs) - followed and summarized;95 (e) cross-references into sibling repos in the same org.96 Follow the exact protocol in `references/issue-intake.md` and produce its intake97 artifact before touching code. `gh issue view` / `glab` / `web_fetch` supply98 structured fields (state, timeline, assignees) as a complement - they NEVER replace99 the rendered read, because linked-PR sidebars, reactions, images, and external100 repro content do not come through cleanly as text.101 - Attempt a rendered read first, every run: `/ego-browser` preferred, browser subagent / Playwright fallback per `references/issue-intake.md`.102 CLI-only is permitted only as a logged exception after a failed rendered attempt, with the intake artifact recording the attempted method, the exact error, and an explicit `VISUALS: UNVERIFIED` flag. Never infer `VISUALS: NONE` from CLI text alone.103 - If no browser tool can launch, or the page fails to load and no fallback renders it:104 STOP. Tell the user plainly what failed and what resolves it (e.g. install/enable the skill, log in for a105 private repo, paste the exact error), and wait. A `gh`-only read is not an106 acceptable substitute for this gate.107 - Opencode / generic agents: invoke it the way this environment loads skills108 (slash-command, Skill tool, or `ego-browser nodejs` heredoc per its SKILL.md).109 Adapt only the invocation format, never the content bar: full thread + visuals110 + external links, every run.111112**Required with graceful solo fallback:**113114- **`/multi-agents`** (steps 7 and 10) - runs the three-role analysis/review brief. See115 `references/multi-agent-brief.md` for the exact shape to hand it. If it isn't installed,116 or there's no subagent-spawning tool at all in this environment, don't let the pipeline117 stall waiting for it - read the brief yourself and work through the three roles in order118 (Root-Cause Analyst, then Codebase & Convention Researcher, then - held back until step119 10 - Senior Maintainer Reviewer) inside your own reasoning instead. You lose the120 independence of a separate pass doing it this way, so be honest in the reviewer role121 rather than rubber-stamping your own work - reread that role's "OUTPUT EXPECTED" in the122 brief and hold your diff to it as if someone else had written it.123124If the call shape either skill actually expects (flags, JSON, a fixed slot count) differs125from what's described here, adapt the *format* to match its real interface but keep the126content and roles intact. If you're ever unsure how one wants to be invoked, ask the user127to paste its SKILL.md once rather than guessing.128129**Optional companions - reach for these when the situation calls for it, not as a checklist130to run through every time:**131132- **`code-review`** - lends its correctness/security/maintainability/performance/testing133 checklist to the Senior Maintainer Reviewer role in step 10, so the review has real134 structure behind it instead of a vague "looks fine."135- **`jev-decisions`** (`references/jev-decisions.md`) - optional `jev_review`136 MCP gate for steps 4, 7, and 10. Scalar scores + confidence with137 `previousEvaluation` deltas instead of a chatty "looks good". Never writes138 code, never replaces tests. Skipped entirely when `JEV_API_KEY` is not139 configured.140- **`documentation`** - for a change that touches public APIs, config, or commands, keeps141 README/CHANGELOG/API docs in sync with the diff instead of leaving them stale.142- **`project-architecture`** - for a cross-cutting or large-feature issue, works out module143 boundaries before step 8 instead of improvising structure mid-implementation.144145## Workflow146147### 1. Parse the link148Extract host, owner, repo, and number. Everything downstream reads from what's detected149here - don't hardcode to whichever project you saw last.150151### 2. Locate and sync the local clone152- Find the repo using the inference order above.153- `git remote -v` to see the actual remote setup (a fork workflow usually has `origin` =154 the user's fork, `upstream` = the real project). Add `upstream` from the parsed155 owner/repo if the fix needs to sync against it and it's missing.156- If `origin` isn't something you'll actually be able to push to later - it points at the157 upstream project itself rather than a fork, and you don't have write access - don't wait158 until step 11 to find that out. Fork it now (`gh repo fork` / `glab repo fork`, run with159 no arguments from inside the clone): both rename the existing `origin` to `upstream` and160 add the new fork as `origin` automatically, so there's somewhere to push when the time161 comes.162- Detect the real default branch (`main`, `master`, `develop`, ...) - don't assume `main`.163 `git fetch` the right remote, check out the default branch, pull.164- If there are uncommitted local changes, **stop and ask** rather than stashing - that165 work may matter to the user.166167### 3. Read the issue or PR (BLOCKING - browser intake only)168Run this inside browser intake per `references/issue-intake.md` (`/ego-browser` preferred, browser subagent fallback). Do not start it via169`gh issue view` alone, and do not treat the first screen as the whole read.1701711. Open the exact URL the user shared in a dedicated browser task space172 (e.g. `contribute-issue-<number>`). Wait for load, capture `snapshotText()`,173 and scroll/expand until the full thread is visible - including collapsed,174 "show more", "load more", and resolved review threads.1752. Capture structured state as a complement (`gh`/`glab`: state, labels,176 assignees, timeline), but the rendered read is the record of truth. A177 maintainer's clarifying comment outranks the original issue body.1783. Inventory and OPEN every visual asset: screenshots, drag-dropped images,179 attachments, GIF/video. View each at full resolution (follow its link or180 screenshot it), and write down what it proves - error text, broken UI state,181 expected vs. actual - not just "has screenshot". An unread image is an182 incomplete read.1834. Inventory and FOLLOW every external URL in the body and comments - repro repo,184 branch, commit, CodeSandbox/StackBlitz/CodePen, live demo, docs page, video,185 log paste, sibling issue/PR. Open each in the same task space, note what it186 contains and whether it still loads. Mark dead links as dead; never silently187 ignore them.1885. Pull out the problem statement, repro steps, acceptance criteria, and how189 labels change scope (bug vs. feature vs. good-first-issue). Quote maintainer190 direction verbatim for the step 7 brief.1916. Write the intake artifact (title, thread summary, visual inventory, external-link192 inventory, related-work leads) exactly as `references/issue-intake.md` defines.193 Steps 4, 6, and 7 MUST NOT start until it exists. If the issue body is thin194 after all of this, say so explicitly - Agent A in step 7 reproduces from the195 visuals/repro link rather than the text.196197### 4. Check for related work and duplicates (still inside browser intake)198Before writing anything, find out if this ground has already been covered, using199the rendered context from step 3 - not title search alone:200- Look at the "linked pull requests" sidebar from step 3 for anything already tied to this201 issue.202- Search the issue/PR body and comments for references to other issues or PRs - including203 ones in **sibling repos** in the same org (a monorepo-adjacent project like204 `sveltejs/svelte` + `sveltejs/kit` cross-references constantly; don't assume the fix205 lives only in the repo the issue was filed against).206- Use browser intake to open any candidate PR(s) you find and read their actual status and207 review history, not just their title. Follow cross-repo references in the browser208 too - a fix that started in a sibling repo reads differently in rendered review209 comments than in a timeline API dump.210- Branch on what you find:211 - **Already merged and it closes this issue** - stop, tell the user it looks resolved212 already (with the link), and check whether the original issue should have been closed213 or whether some part of it is still open.214 - **An open PR already addresses it well** - don't open a competing one. Summarize its215 approach to the user and ask whether to review/improve that PR instead, or move to a216 different issue.217 - **A stale or explicitly rejected prior attempt** - use browser intake to read *why* it218 stalled or was rejected (maintainer review comments are the ground truth here), and219 carry that reasoning into the brief in step 7 so the new attempt doesn't repeat it.220 - **Nothing found** - proceed normally.221- **Optional Jev gate:** if a Jev key is configured, run Gate A from222 `references/jev-decisions.md` on the candidate-PR evidence. It advises only;223 the branches above still decide.224225### 5. Learn the project's own conventions before touching code226Read whatever exists, in priority order: `CONTRIBUTING.md` / `.github/CONTRIBUTING.md`,227`CODE_OF_CONDUCT.md`, `.github/PULL_REQUEST_TEMPLATE.md`, `.github/ISSUE_TEMPLATE/`,228`docs/DEVELOPMENT.md`, the dev-setup section of the root `README.md`, and lint/format/commit229configs (`.eslintrc*`, `.editorconfig`, `rustfmt.toml`, `.pre-commit-config.yaml`,230`commitlint.config.*`). See `references/ecosystem-detection.md` for the language ->231build/test/lint command lookup so you're not guessing `npm test` on a Rust repo. This step232is never skippable, even for a one-line fix - it's what stops a good fix from getting233bounced for a style nit instead of the actual code.234235### 6. Create a working branch236Name it per the project's own stated convention if step 5 turned one up; otherwise237`fix/<issue-number>-<short-slug>` or `feat/<issue-number>-<short-slug>`. Branch off the238freshly-synced default branch from step 2, never off a stale local branch.239240### 7. Delegate deep analysis to /multi-agents241Once steps 3-5 give real context (not before - a vague brief produces vague agent output),242run `/multi-agents` with a three-role brief (or work the same brief solo, wearing each hat243in turn - see "External skills this depends on" above - if it isn't available). The brief's244Shared Context Block MUST include the step 3 intake artifact verbatim - thread quotes,245visual-asset findings, and external-link findings - plus step 4 and step 5 context, so246subagents never re-derive or silently drop what the browser already proved. Read247`references/multi-agent-brief.md` before your first call - it has the full template,248including where the step 4 findings go, and a worked example so the roles come out sharp249instead of generic. In short, the default roles:2502511. **Root-Cause Analyst** - reproduces the bug (or nails the exact functional gap for a252 feature ask) and traces it to the actual responsible lines. Diagnoses; doesn't fix yet.2532. **Codebase & Convention Researcher** - deep-searches the repo for the files the fix254 will touch, prior art (similar past PRs/commits), the conventions gathered in step 5,255 and which existing tests already cover this area.2563. **Senior Maintainer Reviewer** - held back until step 10; reviews a real diff, not the257 issue. Simulates a maintainer of *this specific project*, applying the same258 correctness/security/maintainability/performance/testing lens as the `code-review`259 skill (use it directly if it's available) against the actual stated standards from260 step 5, rather than generic best practice.261262Hand each agent the issue/PR content from step 3, the related-work findings from step 4263(especially any rejected prior approach to avoid repeating), and the conventions from264step 5 directly - they shouldn't have to re-fetch what's already gathered.265- **Optional Jev gate:** if a Jev key is configured, run Gate B from266 `references/jev-decisions.md` on the analysis. Implement only when it passes;267 otherwise loop the roles once, then escalate instead of coding on a guess.268269### 8. Implement270Using Agent A's root cause and Agent B's research as the spec, make the change. Keep the271diff as small as the issue actually requires - note unrelated cleanup opportunities272separately instead of folding them in. Act like a senior earning trust, not a beginner273proving range: one issue, one minimal fix, existing patterns reused. If this is your first274contribution to this repo, prefer the smallest scope that truly closes the issue over a275wider refactor, even when the refactor looks tempting.276277### 9. Verify locally278Run the project's actual test/lint/build commands (from step 5 /279`references/ecosystem-detection.md`), never assumed generic ones. Add or update a test for280the change - a fix with no accompanying test is one of the most common reasons maintainers281request changes. Re-run the full suite, not just the new test, to catch regressions.282283### 10. Maintainer-style review284Send the real diff (not the plan) to the Senior Maintainer Reviewer role from step 7. Have285it check, against this project's own conventions: correctness, test coverage, style/lint286cleanliness, commit hygiene, whether it actually closes the issue as scoped, and anything a287maintainer would flag (missing docs, breaking-change risk, unhandled edge cases). Every288finding that points at code must cite a commit-pinned permalink per289`references/permalink-evidence.md`, never a bare `path:line` on the default branch.290Loop291steps 8 -> 10 until it passes or you hit three rounds; if it still isn't converging, stop292and bring the disagreement to the user instead of pushing something unresolved.293- **Optional Jev gate:** if a Jev key is configured, run Gate C from294 `references/jev-decisions.md` on the diff + test results BEFORE the reviewer295 loop. `approve` goes to the reviewer; `revise` fixes and re-asks once;296 `escalate` or low confidence stops. The reviewer role and the three-round cap297 still apply on every path.298299### 11. Commit, push, and open the PR - automatically, but never past the Voice Gate300301This step has a hard gate inside it. The push is automatic once the gate passes;302it never skips the gate to stay automatic.303304- **11.0 Read the voice rules first.** Before drafting anything public, read305`references/human-voice.md` in full and pull this repo's own last 5 to 6 merged306PR titles and bodies (`gh pr list --state merged --limit 10` or the307browser-intake equivalent). Your title, body, and any comments must match their308length, casing, and issue-link style. Generic templates lose to repo reality309every time.310- **11.1 Draft small.** Pick the template from `references/pr-template.md` by diff311size: tiny (1 to 2 sentences, no headers), small (3 to 6 sentences, no headers312unless the repo template forces them), medium (repo headers only). Never more313bullet lines than changed lines. When the text points at code, use a commit-pinned314permalink plus a short verbatim snippet per `references/permalink-evidence.md`.315Write in B2 casual English with at least one316contraction in anything over 2 sentences. Zero em dashes (—), zero en dashes (–)317as pauses, zero bare `--` pauses in prose. Backticked flags like `--config` are318fine; English pauses are not.319- **11.2 Commit message per the project's own convention** (Conventional Commits -320`fix: ...` / `feat: ...` - by default, unless step 5 turned up something else).321Keep the subject to one thing, short, same casing as merged PRs.322- **11.3 Run the Voice Gate self-check** from `references/human-voice.md` Rule 6323literally (banned-word grep, banned-phrase grep, dash grep, plus the eye checklist:324one-thing title, length matches diff, contraction present, proof line with real325command and result, `Closes #N` once for PR descriptions (skipped for replies and326comments unless closing an issue), no headers/checklists/emoji unless the repo327template demands them). Rewrite until every check passes. A failing draft does not328get pushed "and fixed later".329- **11.4 Confirm the git identity first.** Check `git config --get user.name` /330`git config --get user.email` in this clone. It must resolve to the actual person331submitting the contribution, not a default identity a coding-agent install may have332set globally. If it isn't clearly a real person's identity, stop and ask rather than333guessing or silently overwriting it.334- **11.5 Never add a "Co-authored-by," "Generated by," or similar signature crediting an AI tool335to the commit or PR body unless the project's own CONTRIBUTING.md or PR template336explicitly asks for that disclosure. If it does ask, answer it honestly - don't leave the337field blank or mark it false to get past a policy written specifically to catch that.338Absent an explicit ask, the commit should just read as the submitting contributor's own339work, because the review, testing, and judgment behind it were theirs.340- **11.6 Push and open the PR only after 11.0 to 11.3 pass.** Once step 10 passes and341the Voice Gate passes, push to the user's fork (the one confirmed or created back in342step 2) and open the PR without waiting for a further go-ahead - that's what end-to-end343automation means here. Draft the PR description from `references/pr-template.md`, filled344in with what actually changed, how it was tested, `Closes #<issue-number>` (or whatever345phrasing this project's own template used in step 5), and a mention of any stale/rejected346prior attempt from step 4 if one existed. The same gate covers every follow-up push and347every review reply or issue comment: re-run the self-check on the new text before posting.348If the gate still fails after three rewrites, stop and bring the draft to the user349instead of pushing it anyway.350- If `gh`/`glab` isn't authenticated, or the push fails for any other reason, say so351plainly and tell the user what to run (`gh auth login`, etc.) - never report a PR as352opened when it wasn't. This is the one place a fabricated link would actually mislead353someone, so treat it as a hard rule rather than a judgment call.354- The two exceptions that still stop and ask instead of proceeding: step 4 found an355existing PR that already resolves this (see step 4's branches), step 10 never356converged after three rounds, or the Voice Gate in 11.3 still fails after three357rewrites. A rejected voice draft never gets pushed to "fix later".358359### 12. Hand off360Give CI a few minutes and check it once (`gh pr checks --watch` or the platform361equivalent) before calling this done - not to babysit it through days of human review, but362because a red build from something the local run in step 9 couldn't catch (a CI-only lint363rule, an OS or version you don't have locally) is worth one honest look, and one follow-up364commit if the fix is quick, rather than leaving the user to discover it later. If it's365still red after that look, or just slow to start, don't loop on it - note the status in366the summary and move on.367368One short summary: what the issue was, what changed, what was tested, and the branch/PR369link. Don't re-paste the whole diff - the user just watched it happen.370371## Constraints372373These keep your PR mergeable. They guard review time, not just code.374375- **Do NOT proceed without rendered issue intake** (`references/issue-intake.md`). Attempt a rendered read first, every run. A raw CLI dump is a complement, never a substitute.376- **Do NOT bypass the Human Voice Gate** (`references/human-voice.md`). Zero banned AI buzzwords, zero em dashes, zero en dashes as prose pauses, and zero speculative fluff.377- **Do NOT interrupt the user for routine decisions.** File naming, helper extraction, and test placement are your responsibility. Pause ONLY at the explicit checkpoints.378- **Do NOT open competing PRs** if step 4 finds an existing active or merged PR that resolves the problem.379- **Do NOT cite a bare `path:line` on the default branch in public text** (`references/permalink-evidence.md`). Pin it to a commit SHA and quote the lines verbatim, after verifying the SHA exists.380- **Do NOT push unverified code.** Always execute the project's actual build, lint, and test suites (`references/ecosystem-detection.md`) before pushing.381- **Do NOT add AI disclosure signatures** ("Co-authored-by: AI", "Generated by...") unless the target repository's `CONTRIBUTING.md` or PR template explicitly mandates it.382- **Do NOT guess git author identity.** Always verify `git config user.name` and `user.email` represent the authentic contributor before committing.383- **Do NOT touch or stash uncommitted changes** in the user's local clone without explicit confirmation.384- **Done means:** tests and lint pass locally, one new or updated test covers the fix, Voice Gate Rule 6 passes, PR links `Closes #N` once, CI gets one check in step 12.385386## Checkpoints (the only points that stop and ask)387388Pre-flight safety gates:389390- Uncommitted local changes found in step 2 -> ask, don't stash.391- No local clone found -> ask before cloning, and confirm the path.392- Git identity in step 11 isn't clearly the real submitter -> ask, don't guess.393394Integrity gates (auto-retry 3x, ask only on failure):395396- Browser intake gate fails (no browser tool, page won't render, auth wall, visuals or external repro link unreadable) -> stop and resolve before any code work.397 Never silently downgrade to a gh-only read to stay moving.398- Voice Gate in step 11 still fails after three rewrites -> stop and show the draft to the399 user instead of pushing it anyway.400401Stop-work gates:402403- Step 4 finds an existing merged/strong-open PR that already resolves the issue -> stop404 and tell the user instead of opening a competing one.405- Step 10's review doesn't converge after three rounds -> stop and flag instead of pushing406 anyway.407408Everything else - reading files, running `/multi-agents`,409running tests, iterating on the diff, committing, pushing, and opening the PR - proceeds410straight through without asking, by design. The browser intake gate and the Voice411Gate are part of "straight through": they run every time, they just don't ask, they412complete (intake artifact exists / voice self-check passes) before moving on.413414## Scaling the agent brief415The three-role default fits most single-issue contributions. Adjust only when the issue416genuinely calls for it:417- **Trivial fix** (typo, one-line logic bug, clear repro) - merge Analyst and Researcher418 into one role; go straight to a light review.419- **Cross-cutting or multi-file feature** - add a fourth **Docs/Changelog Agent** (or hand420 this to the `documentation` skill directly) so README/CHANGELOG/API-doc updates aren't421 an afterthought.422- **Continuing someone else's PR** (not a fresh issue) - swap Root-Cause Analyst for a423 **PR State Analyst**: what's already done, what review feedback is still unresolved.424- **A stale/rejected prior attempt turned up in step 4** - give the Root-Cause Analyst that425 attempt's rejection reasoning up front so the new pass doesn't re-propose the same thing.426427Three well-briefed agents beat five thin ones - only add roles the issue actually needs.428429## Works with any project, any language430Nothing above is specific to any one repo, host, or language. Step 1 detects the host,431step 5 detects the project's conventions, and `references/ecosystem-detection.md` detects432the toolchain. Step 4's sibling-repo awareness means it also isn't limited to looking in433just the one repo the issue happened to be filed in. The pipeline shape is the only fixed434part; everything else is discovered fresh on every run.435436## Examples437438### Example 1 - Straightforward fix, no checkpoints hit439> "Here's the next one: `https://github.com/expressjs/express/issues/1234`. Repo's in440> contributions/."4414421. Parses the URL; finds `~/contributions/express` already cloned with `origin` = fork,443 `upstream` = expressjs/express; syncs `main`.4442. Runs the blocking intake in browser intake - full thread, linked-PR sidebar empty,445 one attached screenshot opened at full size confirming the null-route stack, no446 external repro link; writes the intake artifact. A maintainer comment points at447 the null check in `lib/router/route.js`; no prior attempts.4483. Checks `CONTRIBUTING.md` and the lint config, branches `fix/1234-route-null-check`.4494. Runs the three-role brief: Root-Cause Analyst lands on `route.js:38`, Researcher points450 at the existing test pattern in `test/Route.js`.4515. Implements the guard, adds a test, runs the suite and linter, sends the diff through the452 Reviewer role - approved on the first pass.4536. Commits, pushes to the fork, opens the PR from the template, watches CI turn green, and454 hands off with a three-line summary and the PR link.455456Every decision here, from branch name to commit message, was already answered by the457brief and the project's own conventions - nothing needed a check-in.458459### Example 2 - Duplicate work found, checkpoint hit460> "Pick up `https://gitlab.com/some-org/some-app/-/issues/88`."4614621. Locates and syncs the clone, opens the issue.4632. Step 4 turns up an open, approved MR (`!142`) that already closes it, just awaiting464 merge.4653. Stops: "Issue #88 already has an approved, unmerged MR (!142) that closes it - want me466 to review/improve that one instead, or move to a different issue?"467468Opening a second PR here would hand the maintainer two competing fixes to reconcile - this469is exactly what the checkpoint exists for, not a failure of nerve elsewhere in the pipeline.470471### Example 3 - Thin issue, /multi-agents unavailable, agent adapts472> "start this issue: `https://github.com/foo/cli-tool/issues/9` - contributions/"4734741. The issue is one line - "crashes on --verbose" - no repro, no comments. The475 blocking intake still runs in browser intake: full thread scrolled to footer,476 `VISUALS: NONE - verified rendered`, external links NONE - recorded in the intake artifact as gaps.4772. `/multi-agents` isn't installed here. Rather than stalling, works the brief solo:478 reproduces the crash first (Analyst hat), traces it to an unguarded `.split()` on479 undefined output, then switches to the Researcher hat to find the existing480 flag-parsing tests.4813. Implements the fix and a regression test, runs the suite.4824. Reviews its own diff wearing the Reviewer hat as if it were someone else's PR, catches483 that `--verbose --json` together still crashes, and fixes that too before moving on.4845. Opens the PR, noting that the original issue was thin and the repro was reconstructed485 from the stack trace, so a maintainer can sanity-check the interpretation.486487Adapting to what's actually available beats stalling to ask the user to install something488they may not know they're missing.489490## Reference files491492- `references/issue-intake.md` - BLOCKING intake protocol for steps 3-4: how to drive493 browser intake (task space, full-thread scroll, visual-asset handling, external-URL494 handling), the intake artifact shape, and the stop-conditions. Read before opening495 the issue URL. No intake artifact, no code.496- `references/human-voice.md` - BLOCKING for *any* public-facing text (issue comment,497 PR description, merge request comment, review reply, status update). Read it before498 drafting, match this repo's own merged PRs, write in B2 casual English, and run its499 Rule 6 self-check until it passes. Do not push or post while it fails. This is what500 keeps the contribution from being closed on sight as generated text.501- `references/multi-agent-brief.md` - exact brief template + worked example for step 7,502 including where step 4's related-work findings go.503- `references/ecosystem-detection.md` - language/build-tool detection and command lookup504 for steps 5 and 9.505- `references/jev-decisions.md` - optional Jev calibrated gates for steps 4, 7, 10:506 typed questions, thresholds, provider priority, and the decision-log learning loop.507- `references/pr-template.md` - PR description template for step 11.508- `references/permalink-evidence.md` - commit-pinned permalink protocol for every509 code citation in public text (steps 10-11): how to build the link, the snippet510 format, and the SHA check. Bare `path:line` drifts; permalinks do not.