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.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
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:
Do NOT load this skill for:
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.
Before recommending any contribution action, read the relevant local file. The repo documents every constraint; pulling rules verbatim beats guessing.
| File | 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/bug_report.yml | Bug report structure + status:needs-review auto-label + status:approved blocking gate |
.github/ISSUE_TEMPLATE/feature_request.yml | Feature request structure + same gates |
.github/workflows/pr-check.yml | Automated gates: Check Issue Reference, Check Issue Has status:approved, Check PR Has type:* Label, Check PR Cognitive Load |
.github/ISSUE_TEMPLATE/config.yml | Issue-template routing rules; do not bypass |
skills/branch-pr/SKILL.md | Branch + PR creation mechanics |
skills/chained-pr/SKILL.md | Chained vs Stacked PR strategy mechanics |
skills/issue-creation/SKILL.md | Issue creation mechanics |
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.
status:approved from a maintainer. Enforced by pr-check.yml and CONTRIBUTING.md.Closes/Fixes/Resolves #N in the PR body. Refs #N does NOT satisfy Check Issue Reference. Verified empirically on this repo.type:* label per PR. Two type:* labels fail the check. No type:* label fails the check.additions + deletions). Above that, request size:exception from a maintainer with rationale documented in the PR body.Co-Authored-By trailers on commits. AI attribution is not acceptable in this repo.main. It is protected.gh pr view --json labels shows labels: [], do not check the "type:* added" box — write a ## Pending maintainer actions section instead.^(type)(\(scope\))?!?: <description> with exactly one scope (no comma). See skills/branch-pr/SKILL.md for the regex.pi_codegraph, tui/sync, and similar packages. Acknowledging them with the verification method (e.g. git stash baseline) is mandatory. Claiming "all tests pass" without that context is dishonest.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 | ✅ | — |
Add status:approved to an issue | ❌ | ✅ |
Apply type:* label to a PR | ❌ | ✅ |
Apply size:exception label | ❌ | ✅ |
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 the contributor's PR is "stuck" on something, the next step is almost always a maintainer action — not the contributor trying it. Trying it surfaces GraphQL 403 (AddLabelsToLabelable, requestReviewsByLogin, deployment-protection API) and makes the contributor look unaware of the workflow.
Verified empirically in this repo (July 2026): gh pr edit --add-label type:feature returns 403 ardelperal does not have the correct permissions to execute AddLabelsToLabelable. Treat that error as policy, not as a bug.
End-to-end steps to open an issue that becomes a viable PR.
gh search issues or the issue list). Avoid duplicates — CONTRIBUTING.md says PRs on duplicates will be rejected..github/ISSUE_TEMPLATE/bug_report.yml for bugs, feature_request.yml for changes. Each auto-applies status:needs-review via the template's labels: field.status:approved is required) are present for a reason.status:approved. Comment clarifications promptly. This is the gate before any PR opens.slice/journal-cas, slice/four-layer-engine, slice/tui-cli), keep them as technical slices of one approved issue. The umbrella issue keeps status:approved; the sub-issues should also get approved if you want Check Issue Has status:approved to pass per slice.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 via git stash baseline. The repo has known pre-existing failures in internal/components/communitytool/pi_codegraph, internal/tui/sync, and similar — confirm they exist with git stash AND git 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 (or Fixes/Resolves). Never Refs.## 🏷️ PR Type → exactly one [x] type:* matching the actual type## 📝 Summary → one paragraph: what + why## 📂 Changes → file table with line counts from gh pr view --json additions,deletions,changedFiles## 🧪 Test Plan → every go test command actually run + result, including pre-existing failures with verification method## ✅ Contributor Checklist → [x] only where verifiable; [ ] pending maintainer for the rest## 💬 Notes for Reviewers → chain position, merge order, blockersFor 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 --json and address any pending contributor follow-up items you documented in the body.
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 maintainer actions
The following are **maintainer-applied per `pr-check.yml` and CONTRIBUTING.md** in this repo — not within contributor scope:
- [ ] `type:feature` label applied to this PR — pending Alan
- [ ] `size:exception` consideration — see rationale below
- [ ] Fork workflow approval — 4 runs in `action_required` awaiting AlanNumbers 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 maintainer actions and a quoted callout for pre-existing failures is normal and expected.
When the contributor checks a box that doesn't reflect reality:
## Pending maintainer actions with pending Alan suffixgit stash baseline)This repo supports two strategies via gentle-ai-chained-pr:
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).
size:exception for anything past 400 lines of slice-specific additions.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.
Critical limitation: GitHub does NOT support cross-fork base refs. If your slice branches live only in your working repo, the only options are:
The maintainer is the only one who can make Feature Branch Chain work; the contributor alone cannot force it.
Before recommending any action that touches permissions, label state, or commit history:
Dry-verify with gh first. Attempt the action and surface the error if it fails. Example:
$ gh pr edit 1132 --add-label type:feature
→ GraphQL: ardelperal does not have the correct permissions to execute `AddLabelsToLabelable`That output IS your answer. Don't try to work around it.
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,statusCheckRollupCross-check the linked issue state.
gh issue view <N> --json number,title,state,labels,commentsAfter applying a body rewrite, round-trip the body and confirm closingIssuesReferences is populated for the linked issue:
gh pr view <N> --json body --jq '.body' # round-trip
gh pr view <N> --json closingIssuesReferences # confirm linkage parsedTrust 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 -v output, not hope.
Run this in your head (or print and tick) before requesting review:
status:approved (and the linked PR uses Closes/Fixes/Resolves)^(type)(\(single-scope\))?!?: <description> — no comma in scopeCloses/Fixes/Resolves #N, not Refs## 📂 Changes match gh pr view --json additions,deletions,changedFiles[x] claims contradict what the API shows; moves maintainer-applied actions to ## Pending maintainer actionsCo-Authored-By trailersgo build ./... cleango vet ./... clean| Anti-pattern | Symptom | Fix |
|---|---|---|
"type:* added" checkbox while labels: [] | CodeRabbit or maintainer catches the lie on first read | Move to ## Pending maintainer actions with pending Alan |
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 size:exception rationale in Pending maintainer section |
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 |
Trying gh pr edit --add-label as contributor | GraphQL 403 AddLabelsToLabelable | Stop, ask the maintainer via comment on the issue |
| 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" |
When you (the AI assistant) are helping a contributor with anything that touches this repo:
CONTRIBUTING.md / template / workflow section and cite it.When in doubt, the right move is more verification, less action.
CONTRIBUTING.md — full workflow, label taxonomy, branch naming, commit format, review budget..github/PULL_REQUEST_TEMPLATE.md — PR body structure..github/ISSUE_TEMPLATE/bug_report.yml, feature_request.yml — issue body structures..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.skills/issue-creation/SKILL.md — issue creation mechanics in detail.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
e01b114
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.