gentle-ai-collab-perfect
GitHub面向 gentle-ai 项目外部贡献者的协作规范,严格遵循 Issue-first 工作流。涵盖 PR 撰写、链式 PR 策略选择及权限边界判断,确保符合项目审查标准与自动化检查要求。
Trigger Scenarios
Install
npx skills add Gentleman-Programming/gentle-ai --skill gentle-ai-collab-perfect -g -y
SKILL.md
Frontmatter
{
"name": "gentle-ai-collab-perfect",
"license": "Apache-2.0",
"metadata": {
"author": "ardelperal",
"version": "0.1"
},
"description": "Trigger: contributing to Gentleman-Programming\/gentle-ai as an external collaborator. Strict issue-first workflow, honest PR bodies, contributor-vs-maintainer scope, chained-PR strategy, verification protocol, docstring coverage. Load whenever the active repo is Gentleman-Programming\/gentle-ai and any part of the contribution flow is in scope: opening an issue, drafting or editing a PR body, splitting a change into chained\/stacked PRs, or auditing a PR before requesting review."
}
When to use
Use this skill when the active repo is Gentleman-Programming/gentle-ai and the contributor is an external collaborator (not the maintainer). Scope of the skill:
- Opening or commenting on issues
- Drafting, editing, or auditing PR bodies
- Choosing a chained-PR strategy (Stacked vs Feature Branch Chain)
- Cross-checking PR claims against the GitHub API
- Deciding whether an action is contributor-scope or maintainer-scope
Do NOT load this skill for:
- Using gentle-ai as an installer (Gentleman-Programming/gentle-ai is the installer itself; not this skill)
- Reading docs, debugging tests, or reviewing the codebase in general
- Tasks on a different repository
The skill assumes the contributor is working from wherever they push — a fork, a personal working repo, or anywhere they have write access. It deliberately does not assume a fork. Use it whether you push to ardelperal/gentle-ai, to a personal fork, or to a contributor org.
Source of truth — inspect the repo, don't infer
Before recommending any contribution action, inspect the relevant current source. The repo documents every constraint; pulling rules verbatim beats guessing.
| Source | What it tells you |
|---|---|
CONTRIBUTING.md |
Issue-first workflow, label taxonomy, branch naming regex ^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)\/[a-z0-9._-]+$, Conventional Commits format, 400-line review budget |
.github/PULL_REQUEST_TEMPLATE.md |
Required PR body sections (Linked Issue, PR Type, Summary, Changes, Test Plan, Automated Checks, Contributor Checklist, Notes for Reviewers) |
.github/ISSUE_TEMPLATE |
Current issue templates, forms, and routing policy |
| Discovered GitHub labels | Current label names and availability; do not infer them from this skill |
.github/workflows/pr-check.yml |
Automated gates: Check Issue Reference, Check Issue Has status:approved, Check PR Has type:* Label, Check PR Cognitive Load |
skills/branch-pr/SKILL.md |
Branch + PR creation mechanics |
skills/chained-pr/SKILL.md |
Chained vs Stacked PR strategy mechanics |
internal/assets/skills/issue-creation/SKILL.md |
Canonical issue discovery, drafting, privacy review, and publication authority |
skills/cognitive-doc-design/SKILL.md |
Doc-writing principles |
skills/comment-writer/SKILL.md |
Tone for comment replies |
These files evolve. Re-read them at the start of every contribution.
Hard rules (do not negotiate)
- Issue-first is mandatory. No PR opens without an issue that already has
status:approvedunder the canonical issue-creation workflow contract. Enforced bypr-check.ymland CONTRIBUTING.md. - Use
Closes/Fixes/Resolves #Nin the PR body.Refs #Ndoes NOT satisfyCheck Issue Reference. Verified empirically on this repo. - Ordinary
type:*categorization — zero or multiple labels fail the check. Route it through the canonical issue-creation workflow contract: a current direct human instruction binds the exact target/action, target-host capability is verified, and it uses one bounded mutation and target-host readback; otherwise wait without mutation. - Protected policy labels — adding or removing
status:approvedorsize:exceptionrequires verified policy authority from a target-host repository maintainer or repository-authorized approver for the exact target/action, plus authenticated actor target-hostviewerPermissionMAINTAINorADMIN.size:exceptionadditionally requires documented over-budget rationale. - 400-line budget per PR (
additions + deletions). Above that,size:exceptionadditionally requires documented over-budget rationale. - No
Co-Authored-Bytrailers on commits. AI attribution is not acceptable in this repo. - No force-push to
main. It is protected. - PR body checkboxes must reflect API state. If
gh pr view --json labelsshowslabels: [], do not check the "type:* added" box — record the pending canonical PR-label action instead. - PR titles follow
^(type)(\(scope\))?!?: <description>with exactly one scope (no comma). Seeskills/branch-pr/SKILL.mdfor the regex. - Pre-existing test failures are named honestly. This repo has pre-existing failures in
pi_codegraph,tui/sync, and similar packages. Acknowledging them with the verification method (e.g.git stashbaseline) is mandatory. Claiming "all tests pass" without that context is dishonest.
Contributor vs maintainer scope
This split catches external contributors most often. Verify with gh before recommending any action that requires elevated permissions.
| Action | Contributor | Maintainer |
|---|---|---|
| Open / comment on issues | ✅ | — |
| Open a PR from a working branch (wherever they push from) | ✅ | — |
| Edit own PR body | ✅ | — |
| Push commits to own branches | ✅ | — |
| Apply/remove ordinary existing issue labels | Only under the canonical issue-creation workflow contract and target-host capability grant | Same; verify the target host grants the action |
Apply/remove ordinary type:* PR categorization |
Only under the canonical issue-creation workflow contract: current direct human instruction, exact target/action, target-host capability, one bounded mutation and target-host readback | Same; verify the target host grants the action |
Add/remove protected status:approved or size:exception |
Verified policy authority from a repository maintainer or repository-authorized approver plus actor MAINTAIN/ADMIN; size:exception also needs documented rationale |
Same verified policy authority, actor capability, and rationale |
Approve action_required fork-PR workflows (fork approval gate) |
❌ | ✅ |
| Review a PR (approve / request changes) | ❌ | ✅ |
| Merge a PR | ❌ | ✅ |
| Push slice/* branches to upstream so cross-fork base refs work | ❌ | ✅ |
If a PR-label action lacks a current direct instruction or verified target-host capability, wait without mutation. Other maintainer-only actions remain maintainer-only.
Issue workflow
Use the canonical issue-creation skill at internal/assets/skills/issue-creation/SKILL.md for duplicate discovery, template handling, privacy review, and publication. Apply Gentle AI's current repository policy from CONTRIBUTING.md, .github/ISSUE_TEMPLATE, and discovered GitHub labels rather than copying form fields, label names, or commands here.
After submission, return to this collaboration workflow for the contributor/maintainer boundary and the approved-issue gate before PR work. If a maintainer requests technical sub-slices, keep them within the approved issue structure required by the current repository policy and checks.
PR workflow
End-to-end steps once the issue (or chain of sub-issues) is approved.
-
Branch.
git checkout main && git pull git checkout -b <type>/<short-description>Branch name matches the regex in
CONTRIBUTING.md.<short-description>is kebab-case, max a few words. -
Implement. Work-unit commits: each commit is one deliverable unit with its code + tests + docs. Keep rollback reasonable — reverting one commit should not remove unrelated work.
-
Local validation.
go build ./...cleango vet ./...cleango test ./internal/...with pre-existing failures acknowledged viagit stashbaseline. The repo has known pre-existing failures ininternal/components/communitytool/pi_codegraph,internal/tui/sync, and similar — confirm they exist withgit stashANDgit stash pop, then name them in the PR body's Test Plan.
-
Open the PR with
gh pr create. Body matches.github/PULL_REQUEST_TEMPLATE.md:## 🔗 Linked Issue→Closes #N(orFixes/Resolves). NeverRefs.## 🏷️ PR Type→ exactly one[x] type:*matching the actual type## 📝 Summary→ one paragraph: what + why## 📂 Changes→ file table with line counts fromgh pr view --json additions,deletions,changedFiles## 🧪 Test Plan→ everygo testcommand actually run + result, including pre-existing failures with verification method## ✅ Contributor Checklist→[x]only where verifiable;[ ] pending maintainerfor the rest## 💬 Notes for Reviewers→ chain position, merge order, blockers
-
For chained PRs, add a brief dependency diagram showing your sibling PRs and the merge order. Mark the current PR with
📍. -
After opening: check
gh pr checks --jsonand address anypending contributor follow-upitems you documented in the body.
PR body honesty — the single most often-abused rule
Every [x] in the Contributor Checklist is a public claim that pr-check.yml and the maintainer will verify. Three rules:
-
Mark
[x]only when the assertion is true against the API.gh pr view <N> --json labels,closingIssuesReferences,additions,deletions,changedFilesIf
labels: [], do not check the "type:* added" box. Instead:## Pending repository workflow actions The following remain pending: - [ ] Ordinary `type:feature` categorization requires the canonical issue-creation workflow contract - [ ] Protected `size:exception` requires its documented rationale and verified policy authority from a repository maintainer or repository-authorized approver - [ ] Fork workflow approval — 4 runs in `action_required` awaiting a maintainer -
Numbers and file counts must match the API. If you can't trust the API, recount locally:
git diff --stat <base>..<head>. -
Pre-existing failures must be named and methodology stated. "Tests pass" is dishonest if four packages fail in the
git stash-absent baseline. State them:> **Known pre-existing failures (not blocking this PR):** `internal/components/communitytool/pi_codegraph`, `internal/tui/sync`, `internal/tui/sddmode` clusters present on `main` are not introduced by this slice; verified identical via `git stash` baseline.
Honest rewrites often look like adding content, not removing. Adding ## Pending repository workflow actions and a quoted callout for pre-existing failures is normal and expected.
Standard honest-rewrite pattern
When the contributor checks a box that doesn't reflect reality:
- For a PR label, record its pending canonical workflow action; keep other maintainer-only actions distinct
- Update diff numbers to match the API exactly; if a qualifier is needed (e.g. "slice-specific commits only"), state it explicitly
- For test claims, state the exact local commands run and the count of PASS/SKIP observed; don't aggregate to "all pass" if any were skipped on Windows
- Always name pre-existing repo failures that the contributor observed but did not fix, with the verification method (
git stashbaseline) - For process claims (e.g. "blind dual review approved"), reference the artifact (round-1 → round-2 polish commits ARE that evidence)
Chained PR strategy
This repo supports two strategies via gentle-ai-chained-pr:
Stacked to main
Use when each slice can land independently. Branches are independent stacks that each target main. The diff "pollutes" with previous-slice commits because GitHub does not allow cross-fork base refs (slice branches live only in the contributor's working repo).
- Pros: simple, each PR is its own atomic change.
- Cons: large chained diffs; reviewers must mentally isolate slice-specific changes; needs
size:exceptionfor anything past 400 lines of slice-specific additions.
Feature Branch Chain (tracker PR)
Use when the feature integrates as one atomic unit. The maintainer pushes the slice/* branches to the upstream as branch (not PR); child PR #1 targets the tracker branch, child #2 targets the child #1 branch, child #3 targets child #2. The tracker PR stays draft / no-merge until all children are reviewed and merged.
- Pros: clean per-slice diffs; atomic integration; reversible as a unit.
- Cons: requires maintainer cooperation to push slice branches upstream; slower.
Critical limitation: GitHub does NOT support cross-fork base refs. If your slice branches live only in your working repo, the only options are:
- Stacked to main (with polluted diffs) — accept the reality
- Ask the maintainer to push slice branches upstream so you can do Feature Branch Chain
The maintainer is the only one who can make Feature Branch Chain work; the contributor alone cannot force it.
Verification protocol
Before recommending any action that touches permissions, label state, or commit history:
-
Verify authority before a PR-label action. Use the canonical issue-creation workflow contract; do not probe a mutation to discover authority.
-
Cross-check PR body claims against the GitHub API.
gh pr view <N> --json \ labels,closingIssuesReferences,additions,deletions,changedFiles,\ headRefName,baseRefName,isCrossRepository,headRepository,maintainerCanModify,\ reviewDecision,statusCheckRollup -
Cross-check the linked issue state.
gh issue view <N> --json number,title,state,labels,comments -
After applying a body rewrite, round-trip the body and confirm
closingIssuesReferencesis populated for the linked issue:gh pr view <N> --json body --jq '.body' # round-trip gh pr view <N> --json closingIssuesReferences # confirm linkage parsed -
Trust the contributor's lived permissions over inferred defaults. If they say "I can only do X", route everything else to the maintainer — don't waste their PR review budget on GraphQL 403s.
-
Always run the actual test command before claiming it passes. "Tests pass" must reflect
go test ./path/to/pkg -voutput, not hope.
Pre-PR self-audit checklist
Run this in your head (or print and tick) before requesting review:
- Linked issue has
status:approved(and the linked PR usesCloses/Fixes/Resolves) - PR title follows
^(type)(\(single-scope\))?!?: <description>— no comma in scope - Body uses
Closes/Fixes/Resolves #N, notRefs - Line counts in
## 📂 Changesmatchgh pr view --json additions,deletions,changedFiles - No
[x]claims contradict what the API shows; moves pending actions to## Pending repository workflow actions - Pre-existing failures named with verification method
- Conventional Commits in title and commit messages
- No
Co-Authored-Bytrailers - Branch name matches the regex in CONTRIBUTING.md
- Commits are work-unit-sized (one deliverable per commit)
- Chained-slice strategy agreed with the maintainer (Stacked vs Feature Branch Chain)
- Docstring coverage on exported items in the diff ≥80% (CodeRabbit pre-merge check)
-
go build ./...clean -
go vet ./...clean - Local test run with pre-existing failures acknowledged
Anti-patterns
| Anti-pattern | Symptom | Fix |
|---|---|---|
"type:* added" checkbox while labels: [] |
CodeRabbit or maintainer catches the lie on first read | Record the pending canonical PR-label action |
Refs #N instead of Closes #N |
Check Issue Reference fails; PR auto-rejected |
Use Closes/Fixes/Resolves keyword |
[x] PR stays within 400 changed lines for a 3,200-line PR |
Check PR Cognitive Load fails; size:exception not requested |
Compute real totals, document the rationale and verified policy authority in Pending repository workflow actions |
feat(tui,cli): wire... title |
Title fails the single-scope regex | Use one of feat(tui): ..., feat(cli): ..., feat(tui-cli): ... (dash, not comma) |
Slice branches all base on main with stale carry-over commits |
Reviewers can't isolate slice-specific changes; size:exception needed |
Accept Stacked to main (request exception) OR ask maintainer to push slice branches upstream and use Feature Branch Chain |
| Mutating a PR label without canonical authority | No current direct instruction or verified capability | Wait without mutation |
| Burning reviewer attention on smoke-test green | Low-cardinality tests pass without exercising the behavior; reviewer flags in CodeRabbit | Each test asserts specific behavior, not just non-panicking |
Pretending local test run = go test ./... clean |
Repo has pre-existing failures (pi_codegraph, tui/sync); saying "all tests pass" is dishonest |
Run with git stash baseline, name pre-existing failures explicitly |
| Calling a working repo a "fork" in code or docs | Misrepresents the contributor's relationship to the upstream | Use neutral language: "your working branch", "the contributor's push location", not "your fork" |
How to apply this skill — workflow for the AI assistant
When you (the AI assistant) are helping a contributor with anything that touches this repo:
- Before recommending any action, look up the relevant
CONTRIBUTING.md/ template / workflow section and cite it. - Before any label, status, merge, or fork-workflow approval, check the contributor-vs-maintainer scope table. Route PR labels only through the canonical issue-creation workflow contract; route other maintainer-only actions to a maintainer without suggesting an unauthorized attempt.
- Before recommending body rewrites, fetch the PR's current state and cross-check every claim against the API.
- Before recommending chained-PR structure, ask the contributor whether each slice can land independently (Stacked) or needs atomic integration (Feature Branch Chain). Be explicit about the cross-fork base-ref limitation.
- Always use Conventional Commits in title and commit messages.
When in doubt, the right move is more verification, less action.
References
CONTRIBUTING.md— full workflow, label taxonomy, branch naming, commit format, review budget..github/PULL_REQUEST_TEMPLATE.md— PR body structure..github/ISSUE_TEMPLATE— current issue templates, forms, and routing policy..github/workflows/pr-check.yml— automated gates.skills/branch-pr/SKILL.md— branch + PR creation mechanics in detail.skills/chained-pr/SKILL.md— chained vs stacked PR strategy mechanics in detail.internal/assets/skills/issue-creation/SKILL.md— canonical issue-creation authority.skills/cognitive-doc-design/SKILL.md— doc-writing principles (low cognitive load).skills/comment-writer/SKILL.md— tone and structure for PR comments and issue replies.skills/work-unit-commits/SKILL.md— splitting commits for review-friendly PRs.
GitHub Actions docs for the action_required gate used in fork PRs: https://docs.github.com/actions/managing-workflow-runs/approving-workflow-runs-from-public-forks
Version History
-
cc4ed69
Current 2026-08-28 11:04
修复受保护标签工作流;强化委托审批权限;允许委托分类操作。
-
35deba3
2026-08-20 00:49
修正技能描述中的术语一致性,将 'inspect the repo' 统一为 'read the repo'。
- e01b114 2026-07-25 07:00


