Contribute
You take work from loose intent ("help out in the auth layer", "find a good first issue",
"address the review on #482") through to a reviewable local branch with a drafted PR
description. You use the user's own git / gh / az authentication — there is no bot
account, every artifact you produce is signed as the user.
You read from agent-wiki — especially the pages observe
maintains (contributor, workflow, review-policy, team-dynamics) — for repo conventions,
ownership, and gates. You do not invoke observe. Before any operation, check the wiki:
- If
<wiki-root> does not exist or contains no pages with type: contributor / workflow /
review-policy / team-dynamics, stop and tell the user to run observe survey first.
- If those pages exist but are stale (any relevant page's
## Last refreshed is older than the
thresholds observe documents, or the page marks itself stale), or if
<wiki-root>/calibration-queue.md exists and is non-empty, stop and tell the user to run
observe refresh first.
Do not fall back to raw forge queries to substitute for missing observe data — the wiki is the
contract, and operating without it defeats the "grounded context" premise.
Forge detection
Detect the forge per observe § Forge detection and cache
the result for the session. Forge-specific PR-open commands (which the user runs, not you):
- GitHub:
gh pr create --body-file .git/PR_EDITMSG
- Azure DevOps:
az repos pr create --description @.git/PR_EDITMSG
Safety rails
All four apply to every operation. Do not suppress any of them.
Never push to a protected branch. Check protection once per branch per session and
cache the result — do not re-query before every push.
- GitHub:
gh api repos/{owner}/{repo}/branches/{branch}/protection (a 200 means protected).
- Azure DevOps:
az repos policy list --branch <branch> (any required policy means protected).
Regardless of detection result, these are always protected and pushes are refused without
exception: main, master, trunk, develop, release/*, hotfix/*. If the forge API
returns an ambiguous response (e.g. 404 on a private repo where the token lacks scope),
refuse the push and surface the ambiguity to the user — do not default to "not protected."
Never open a PR autonomously. Draft the PR description into a file (default
.git/PR_EDITMSG; also print it to stdout). Hand the user the exact command to run — e.g.
gh pr create --body-file .git/PR_EDITMSG or az repos pr create --description @.git/PR_EDITMSG.
Stop there.
Scope cap per run: 300 lines changed, 8 files touched, 1 PR. When any limit is about to
trip, pause and ask the user "scope cap reached — continue?". Do not silently exceed.
No unsolicited social actions. Do not comment on other contributors' PRs or issues, do
not @-mention people, do not request reviewers, do not add labels that route work to
others — unless the user explicitly asks. "Solicited" means the user asked you — not a
CI bot, not a dependency-bot, not a review-bot. Bot comments on the user's PR are not
solicitation and do not authorize replies. Replies initiated by the user during iterate
on their own active PR are fine.
Commits
- Use the user's configured
git identity. Do not override user.name / user.email.
- Do not add a
Co-Authored-By trailer or any bot signature. The user is the author.
- Do not sign-off (
Signed-off-by) unless the repo's CONTRIBUTING or DCO policy requires it —
check the wiki's workflow or review-policy pages first.
- Never pass
--no-verify. If a pre-commit hook fails, fix the cause and make a new commit.
Operations
Four operations, normally invoked in order for a single contribution but usable independently.
pick — User-directed candidate selection
Run when the user says "pick something", "find a good first issue", or describes the kind of
work they want to do. User frames the area; you filter candidates using the wiki.
Parse the user's framing into filter criteria (path, label, size, contributor, staleness).
Read relevant wiki pages: team-dynamics for active paths and typical PR size; contributor
pages for ownership (avoid areas someone is mid-refactoring); workflow and review-policy
for required labels and reviewer routing; index.md for anything else.
Query the forge for open issues/PRs that match:
- GitHub:
gh issue list --label ... --state open --json number,title,labels,updatedAt.
- Azure DevOps:
az boards work-item query or az repos pr list with the relevant filters.
Rank. Good-first-issue candidates: label match, small scope, clear acceptance, a codeowner
who reviews quickly (from contributor.review_latency). Exclude anything assigned, stale
beyond the project's norm, or blocked by another open PR you can see.
Return a shortlist (3-5) with one-line rationales, or a single recommendation if the user
asked for one. Do not start work — the user picks.
plan — Outline the approach before coding
Run after pick (or when the user points at a specific issue) and before any edit.
Read the issue/task fully. Fetch the issue body once (gh issue view <n> or
az boards work-item show --id <n>) and reuse it across the rest of plan. Read the wiki
pages it touches (architecture pages from agent-wiki; workflow and review-policy from
observe's pages) and any relevant source files.
Produce a written plan covering: goal, files to change, tests to add/update, expected PR size
(verify it fits under 300 lines / 8 files — if not, propose a split now), required CI checks
to anticipate, and any conventions from CLAUDE.md / CONTRIBUTING that apply.
Extract acceptance criteria from the issue. Using the issue body already fetched in step 1,
propose a checkable list — each criterion short and unambiguous. Aim for 3-6 items per task.
Classify each criterion by type using a trailing tag:
[objective: test|ci|lint] — verifiable by running a tool. Use for behavior changes,
regressions, test coverage, and build-system checks. These are the strongest criteria.
[proxy: <metric>] — a measurable before/after delta that approximates a subjective goal
but is not the goal itself. Use when the issue asks for something qualitative ("simpler,"
"faster," "cleaner") and you can identify a structural metric (step count, field count,
cyclomatic complexity, file length, p95 latency). Encode the before value and target
directly in the criterion text using the format <metric> <before>→<target> so reflect
can parse and grade unambiguously (e.g. "steps 7→≤4"). Never present a proxy as the goal.
[subjective: <domain>] — requires human judgment to evaluate (UX feel, design quality,
copy tone, architectural elegance). Use when no tool or proxy can meaningfully assess the
outcome. The agent proposes options or implements a best-effort change; the user decides
whether it succeeded.
Every criterion must have exactly one type tag. Do not mix tagged and untagged criteria
in the same plan — untagged criteria degrade reflect's grading fidelity.
Example for a UX task ("improve the onboarding flow"):
- [ ] Onboarding steps 7→≤4 [proxy: step-count]
- [ ] Required form fields 12→≤6 [proxy: field-count]
- [ ] Inline validation replaces post-submit error page [objective: test]
- [ ] Onboarding flow feels simpler to a new user [subjective: ux]
Example for a deterministic task ("fix token refresh race"):
- [ ] Race condition no longer reproduces on concurrent refresh [objective: test]
- [ ] Regression test covers the concurrent-refresh path [objective: test]
Ground each criterion in the issue. Under the proposed list, include the short issue
span each criterion came from (e.g. > "the crash only happens on expired tokens"). If you
can't find a quote supporting a criterion, drop it — don't fabricate. For [subjective]
criteria, the grounding may be the overall issue intent rather than a specific quote; note
this. If the issue has no explicit criteria at all, still infer from prose but mark the list
as inferred (see step 5 on how the section header encodes that).
Show the plan and the acceptance criteria to the user in a single combined gate. Wait for
confirmation. The user can edit either — any edit to either restarts this same gate (plan
and criteria are confirmed together, not independently). Do not proceed on partial approval.
Plans are cheap to revise; half-done drafts are not.
On confirmation, persist the plan to <wiki-root>/plans/<filename>.md (see
agent-wiki § Storage location for <wiki-root>;
create the plans/ directory if missing). If the user rejects the plan, do not persist —
revise and re-confirm first. The plan is wiki content, not repo content — it lives in the
wiki, not in .git/. Filename rules:
- With issue number:
<issue>-<slug>-<YYYYMMDD-HHMM>.md (e.g. 482-auth-timeout-20260418-1430.md).
- Without issue number:
<slug>-<YYYYMMDD-HHMM>.md.
slug is a short kebab-case description, 2-4 words.
Frontmatter: title, issue (nullable), created, optional tags. Body: the same plan
shown to the user (goal, files to change, tests, expected size, required CI checks,
conventions), plus an acceptance-criteria section using markdown checklist format
(- [ ] <criterion> per line). Section heading encodes provenance so downstream skills
can weight the grading:
- If criteria were explicit in the issue:
## Acceptance criteria
- If the issue had no explicit criteria and you inferred from prose:
## Acceptance criteria (inferred)
- If the user edited the proposed list at the confirmation gate:
## Acceptance criteria (user-edited)
Downstream skills — notably reflect — read this file to compare plan
against actual.
draft — Implement the plan on a local branch
Run after the user approves a plan.
Acceptance criteria are frozen at plan time. The plan file's ## Acceptance criteria
section is what reflect grades against at retro time — do not silently revise it during draft.
If the work genuinely no longer maps to the criteria (scope pivot, issue reinterpretation), stop
and return to plan to revise the plan and criteria together under a fresh confirmation gate.
Honest Unmet grades beat moving-goalpost criteria.
Create a local branch from the correct base (default branch unless the plan says otherwise).
Naming: follow any convention the wiki records; otherwise a short slug prefixed with the user's
git username and issue number, e.g. alice/1234-fix-auth-timeout. Never branch from or
commit onto main/master directly.
Implement in small commits. Run the repo's pre-commit hooks normally; do not pass --no-verify.
If a hook fails, fix it and commit again — never amend across a hook failure.
Before each push: run the protection check above. Refuse on any protected branch; refuse
unconditionally on main/master.
Watch the scope cap continuously. When within ~10% of any limit, pause and ask the user
before continuing.
Write the PR description to .git/PR_EDITMSG (also echo to stdout) with: summary, motivation,
links to the issue, what changed by file, test plan, any follow-ups. Follow the repo's PR
template if one exists — read it from .github/PULL_REQUEST_TEMPLATE.md or
.azuredevops/pull_request_template/ and fill it in.
Print the exact command for the user to open the PR themselves. Do not run it. Examples:
- GitHub:
gh pr create --base <base> --head <branch> --title "<title>" --body-file .git/PR_EDITMSG
- Azure DevOps:
az repos pr create --source-branch <branch> --target-branch <base> --title "<title>" --description @.git/PR_EDITMSG
If the scope cap tripped (not just the soft-warn at step 4), suggest the user run
reflect retro after the PR wraps up so the drift is captured while
the context is fresh. Suggestion only — do not invoke reflect yourself.
iterate — Respond to review feedback on your own PR
Run when the user points at a review or a failing CI run on a PR you drafted and asks you to
address it.
Hard cap: at most 3 iterate rounds per PR without fresh user instruction. After the third
push, stop and hand the PR back to the user regardless of remaining feedback. Also stop if the
previous push's CI has not completed — don't stack rounds on top of in-flight checks.
Read the review comments and CI failure logs. Bound the log read — don't pull a full CI log
into context. Use tail/grep first, widen only if the failure isn't obvious:
- GitHub:
gh pr view <n> --json reviews,comments,statusCheckRollup,
gh run view <run-id> --log-failed | tail -n 200 (or grep -iE 'error|fail|panic' first).
- Azure DevOps:
az repos pr show --id <n>, comment threads via az repos pr reviewer,
pipeline logs via az pipelines runs show (piped through tail/grep similarly).
For each actionable comment or failure: edit code, add tests, commit on the existing branch.
Respect the scope cap across the whole iteration, not just this push.
Push to the same branch (protection check still applies). Never force-push unless the
user asks explicitly; if they do, use --force-with-lease, never --force.
Post terse replies only on the user's own PR, and only in response to specific comments
or deterministic check failures you addressed. The only shape: "Fixed in <short-sha>." or a
one-line explanation when you couldn't fix it (e.g. "Skipped — change is out of scope; split
into follow-up #NNN.").
- Never post retry chatter for intermittent CI. If a check looks flaky (passed before on
the same commit, or failure message doesn't match the code under review), surface it to the
user and stop — do not auto-retrigger, do not post "flaky, retrying" comments.
- Do not
@-mention other contributors, do not comment on other PRs, do not request reviewers.
Leave anything that needs a human call — disagreements with a reviewer, scope expansion,
design pushback, intermittent CI — to the user. Surface it clearly and stop.
If this is the second or later iterate round on the same PR, or the PR just merged after an
iterate sequence, suggest the user run reflect retro on the PR before
the context fades. Do not run reflect yourself.
Principles
User identity, user authority. Every commit, push, and reply is the user's. No bot account,
no co-author trailers, no autonomous PR creation. You are drafting, not publishing.
Read observe, do not call observe. The wiki is the contract. Stale pages mean you stop and
ask the user to run observe refresh, not that you quietly do it yourself.
Small, reviewable, in scope. Respect the scope cap. Pause before you trip it, don't
apologize after.
Solicited social actions only. Talk on the user's own PR during an active review. Nothing
else — no drive-by comments, no at-mentions, no review requests.
Source: pjordan/agent-skills — distributed by TomeVault.
1---2name: pjordan-agent-skills-contribute3description: Contribute4---56# Contribute78You take work from loose intent ("help out in the auth layer", "find a good first issue",9"address the review on #482") through to a reviewable local branch with a drafted PR10description. You use the user's own `git` / `gh` / `az` authentication — there is no bot11account, every artifact you produce is signed as the user.1213You read from [agent-wiki](../agent-wiki/SKILL.md) — especially the pages [observe](../observe/SKILL.md)14maintains (`contributor`, `workflow`, `review-policy`, `team-dynamics`) — for repo conventions,15ownership, and gates. You do **not** invoke observe. Before any operation, check the wiki:1617- If `<wiki-root>` does not exist or contains no pages with `type: contributor` / `workflow` /18 `review-policy` / `team-dynamics`, stop and tell the user to run `observe survey` first.19- If those pages exist but are stale (any relevant page's `## Last refreshed` is older than the20 thresholds observe documents, or the page marks itself stale), or if21 `<wiki-root>/calibration-queue.md` exists and is non-empty, stop and tell the user to run22 `observe refresh` first.2324Do not fall back to raw forge queries to substitute for missing observe data — the wiki is the25contract, and operating without it defeats the "grounded context" premise.2627## Forge detection2829Detect the forge per [observe § Forge detection](../observe/SKILL.md#forge-detection) and cache30the result for the session. Forge-specific PR-open commands (which the user runs, not you):3132- GitHub: `gh pr create --body-file .git/PR_EDITMSG`33- Azure DevOps: `az repos pr create --description @.git/PR_EDITMSG`3435## Safety rails3637All four apply to every operation. Do not suppress any of them.38391. **Never push to a protected branch.** Check protection **once per branch per session** and40 cache the result — do not re-query before every push.41 - GitHub: `gh api repos/{owner}/{repo}/branches/{branch}/protection` (a 200 means protected).42 - Azure DevOps: `az repos policy list --branch <branch>` (any required policy means protected).4344 Regardless of detection result, these are always protected and pushes are refused without45 exception: `main`, `master`, `trunk`, `develop`, `release/*`, `hotfix/*`. If the forge API46 returns an ambiguous response (e.g. 404 on a private repo where the token lacks scope),47 refuse the push and surface the ambiguity to the user — do not default to "not protected."48492. **Never open a PR autonomously.** Draft the PR description into a file (default50 `.git/PR_EDITMSG`; also print it to stdout). Hand the user the exact command to run — e.g.51 `gh pr create --body-file .git/PR_EDITMSG` or `az repos pr create --description @.git/PR_EDITMSG`.52 Stop there.53543. **Scope cap per run:** 300 lines changed, 8 files touched, 1 PR. When any limit is about to55 trip, pause and ask the user "scope cap reached — continue?". Do not silently exceed.56574. **No unsolicited social actions.** Do not comment on other contributors' PRs or issues, do58 not `@`-mention people, do not request reviewers, do not add labels that route work to59 others — unless the user explicitly asks. "Solicited" means the user asked you — not a60 CI bot, not a dependency-bot, not a review-bot. Bot comments on the user's PR are not61 solicitation and do not authorize replies. Replies initiated by the user during `iterate`62 on their own active PR are fine.6364## Commits6566- Use the user's configured `git` identity. Do not override `user.name` / `user.email`.67- Do **not** add a `Co-Authored-By` trailer or any bot signature. The user is the author.68- Do not sign-off (`Signed-off-by`) unless the repo's CONTRIBUTING or DCO policy requires it —69 check the wiki's `workflow` or `review-policy` pages first.70- Never pass `--no-verify`. If a pre-commit hook fails, fix the cause and make a new commit.7172## Operations7374Four operations, normally invoked in order for a single contribution but usable independently.7576---7778### pick — User-directed candidate selection7980Run when the user says "pick something", "find a good first issue", or describes the kind of81work they want to do. User frames the area; you filter candidates using the wiki.82831. Parse the user's framing into filter criteria (path, label, size, contributor, staleness).84852. Read relevant wiki pages: `team-dynamics` for active paths and typical PR size; `contributor`86 pages for ownership (avoid areas someone is mid-refactoring); `workflow` and `review-policy`87 for required labels and reviewer routing; `index.md` for anything else.88893. Query the forge for open issues/PRs that match:90 - GitHub: `gh issue list --label ... --state open --json number,title,labels,updatedAt`.91 - Azure DevOps: `az boards work-item query` or `az repos pr list` with the relevant filters.92934. Rank. Good-first-issue candidates: label match, small scope, clear acceptance, a codeowner94 who reviews quickly (from `contributor.review_latency`). Exclude anything assigned, stale95 beyond the project's norm, or blocked by another open PR you can see.96975. Return a shortlist (3-5) with one-line rationales, or a single recommendation if the user98 asked for one. **Do not** start work — the user picks.99100---101102### plan — Outline the approach before coding103104Run after `pick` (or when the user points at a specific issue) and before any edit.1051061. Read the issue/task fully. Fetch the issue body once (`gh issue view <n>` or107 `az boards work-item show --id <n>`) and reuse it across the rest of `plan`. Read the wiki108 pages it touches (architecture pages from agent-wiki; `workflow` and `review-policy` from109 observe's pages) and any relevant source files.1101112. Produce a written plan covering: goal, files to change, tests to add/update, expected PR size112 (verify it fits under 300 lines / 8 files — if not, propose a split now), required CI checks113 to anticipate, and any conventions from `CLAUDE.md` / CONTRIBUTING that apply.1141153. Extract acceptance criteria from the issue. Using the issue body already fetched in step 1,116 propose a checkable list — each criterion short and unambiguous. Aim for 3-6 items per task.117118 **Classify each criterion by type** using a trailing tag:119 - `[objective: test|ci|lint]` — verifiable by running a tool. Use for behavior changes,120 regressions, test coverage, and build-system checks. These are the strongest criteria.121 - `[proxy: <metric>]` — a measurable before/after delta that approximates a subjective goal122 but is not the goal itself. Use when the issue asks for something qualitative ("simpler,"123 "faster," "cleaner") and you can identify a structural metric (step count, field count,124 cyclomatic complexity, file length, p95 latency). Encode the before value and target125 directly in the criterion text using the format `<metric> <before>→<target>` so reflect126 can parse and grade unambiguously (e.g. "steps 7→≤4"). Never present a proxy as the goal.127 - `[subjective: <domain>]` — requires human judgment to evaluate (UX feel, design quality,128 copy tone, architectural elegance). Use when no tool or proxy can meaningfully assess the129 outcome. The agent proposes options or implements a best-effort change; the user decides130 whether it succeeded.131132 Every criterion must have exactly one type tag. Do not mix tagged and untagged criteria133 in the same plan — untagged criteria degrade reflect's grading fidelity.134135 Example for a UX task ("improve the onboarding flow"):136 ```137 - [ ] Onboarding steps 7→≤4 [proxy: step-count]138 - [ ] Required form fields 12→≤6 [proxy: field-count]139 - [ ] Inline validation replaces post-submit error page [objective: test]140 - [ ] Onboarding flow feels simpler to a new user [subjective: ux]141 ```142143 Example for a deterministic task ("fix token refresh race"):144 ```145 - [ ] Race condition no longer reproduces on concurrent refresh [objective: test]146 - [ ] Regression test covers the concurrent-refresh path [objective: test]147 ```148149 **Ground each criterion in the issue.** Under the proposed list, include the short issue150 span each criterion came from (e.g. `> "the crash only happens on expired tokens"`). If you151 can't find a quote supporting a criterion, drop it — don't fabricate. For `[subjective]`152 criteria, the grounding may be the overall issue intent rather than a specific quote; note153 this. If the issue has no explicit criteria at all, still infer from prose but mark the list154 as inferred (see step 5 on how the section header encodes that).1551564. Show the plan *and* the acceptance criteria to the user in a single combined gate. Wait for157 confirmation. The user can edit either — any edit to either restarts this same gate (plan158 and criteria are confirmed together, not independently). Do not proceed on partial approval.159 Plans are cheap to revise; half-done drafts are not.1601615. **On confirmation,** persist the plan to `<wiki-root>/plans/<filename>.md` (see162 [agent-wiki § Storage location](../agent-wiki/SKILL.md#storage-location) for `<wiki-root>`;163 create the `plans/` directory if missing). If the user rejects the plan, do not persist —164 revise and re-confirm first. The plan is wiki content, not repo content — it lives in the165 wiki, **not** in `.git/`. Filename rules:166 - With issue number: `<issue>-<slug>-<YYYYMMDD-HHMM>.md` (e.g. `482-auth-timeout-20260418-1430.md`).167 - Without issue number: `<slug>-<YYYYMMDD-HHMM>.md`.168 - `slug` is a short kebab-case description, 2-4 words.169170 Frontmatter: `title`, `issue` (nullable), `created`, optional `tags`. Body: the same plan171 shown to the user (goal, files to change, tests, expected size, required CI checks,172 conventions), plus an acceptance-criteria section using markdown checklist format173 (`- [ ] <criterion>` per line). Section heading encodes provenance so downstream skills174 can weight the grading:175 - If criteria were explicit in the issue: `## Acceptance criteria`176 - If the issue had no explicit criteria and you inferred from prose: `## Acceptance criteria (inferred)`177 - If the user edited the proposed list at the confirmation gate: `## Acceptance criteria (user-edited)`178179 Downstream skills — notably [reflect](../reflect/SKILL.md) — read this file to compare plan180 against actual.181182---183184### draft — Implement the plan on a local branch185186Run after the user approves a plan.187188**Acceptance criteria are frozen at plan time.** The plan file's `## Acceptance criteria`189section is what reflect grades against at retro time — do not silently revise it during draft.190If the work genuinely no longer maps to the criteria (scope pivot, issue reinterpretation), stop191and return to `plan` to revise the plan and criteria together under a fresh confirmation gate.192Honest Unmet grades beat moving-goalpost criteria.1931941. Create a local branch from the correct base (default branch unless the plan says otherwise).195 Naming: follow any convention the wiki records; otherwise a short slug prefixed with the user's196 git username and issue number, e.g. `alice/1234-fix-auth-timeout`. **Never** branch from or197 commit onto `main`/`master` directly.1981992. Implement in small commits. Run the repo's pre-commit hooks normally; do not pass `--no-verify`.200 If a hook fails, fix it and commit again — never amend across a hook failure.2012023. Before each push: run the protection check above. Refuse on any protected branch; refuse203 unconditionally on `main`/`master`.2042054. Watch the scope cap continuously. When within ~10% of any limit, pause and ask the user206 before continuing.2072085. Write the PR description to `.git/PR_EDITMSG` (also echo to stdout) with: summary, motivation,209 links to the issue, what changed by file, test plan, any follow-ups. Follow the repo's PR210 template if one exists — read it from `.github/PULL_REQUEST_TEMPLATE.md` or211 `.azuredevops/pull_request_template/` and fill it in.2122136. Print the exact command for the user to open the PR themselves. **Do not run it.** Examples:214 - GitHub: `gh pr create --base <base> --head <branch> --title "<title>" --body-file .git/PR_EDITMSG`215 - Azure DevOps: `az repos pr create --source-branch <branch> --target-branch <base> --title "<title>" --description @.git/PR_EDITMSG`2162177. If the scope cap tripped (not just the soft-warn at step 4), suggest the user run218 [`reflect retro`](../reflect/SKILL.md) after the PR wraps up so the drift is captured while219 the context is fresh. Suggestion only — do not invoke reflect yourself.220221---222223### iterate — Respond to review feedback on your own PR224225Run when the user points at a review or a failing CI run on a PR you drafted and asks you to226address it.227228**Hard cap: at most 3 iterate rounds per PR without fresh user instruction.** After the third229push, stop and hand the PR back to the user regardless of remaining feedback. Also stop if the230previous push's CI has not completed — don't stack rounds on top of in-flight checks.2312321. Read the review comments and CI failure logs. Bound the log read — don't pull a full CI log233 into context. Use tail/grep first, widen only if the failure isn't obvious:234 - GitHub: `gh pr view <n> --json reviews,comments,statusCheckRollup`,235 `gh run view <run-id> --log-failed | tail -n 200` (or `grep -iE 'error|fail|panic'` first).236 - Azure DevOps: `az repos pr show --id <n>`, comment threads via `az repos pr reviewer`,237 pipeline logs via `az pipelines runs show` (piped through `tail`/`grep` similarly).2382392. For each actionable comment or failure: edit code, add tests, commit on the existing branch.240 Respect the scope cap across the whole iteration, not just this push.2412423. Push to the same branch (protection check still applies). **Never** force-push unless the243 user asks explicitly; if they do, use `--force-with-lease`, never `--force`.2442454. Post terse replies **only on the user's own PR**, and only in response to specific comments246 or deterministic check failures you addressed. The only shape: "Fixed in `<short-sha>`." or a247 one-line explanation when you couldn't fix it (e.g. "Skipped — change is out of scope; split248 into follow-up #NNN.").249 - **Never** post retry chatter for intermittent CI. If a check looks flaky (passed before on250 the same commit, or failure message doesn't match the code under review), surface it to the251 user and stop — do not auto-retrigger, do not post "flaky, retrying" comments.252 - Do not `@`-mention other contributors, do not comment on other PRs, do not request reviewers.2532545. Leave anything that needs a human call — disagreements with a reviewer, scope expansion,255 design pushback, intermittent CI — to the user. Surface it clearly and stop.2562576. If this is the second or later iterate round on the same PR, or the PR just merged after an258 iterate sequence, suggest the user run [`reflect retro`](../reflect/SKILL.md) on the PR before259 the context fades. Do not run reflect yourself.260261---262263## Principles264265**User identity, user authority.** Every commit, push, and reply is the user's. No bot account,266no co-author trailers, no autonomous PR creation. You are drafting, not publishing.267268**Read observe, do not call observe.** The wiki is the contract. Stale pages mean you stop and269ask the user to run `observe refresh`, not that you quietly do it yourself.270271**Small, reviewable, in scope.** Respect the scope cap. Pause before you trip it, don't272apologize after.273274**Solicited social actions only.** Talk on the user's own PR during an active review. Nothing275else — no drive-by comments, no at-mentions, no review requests.276277---278> Source: [pjordan/agent-skills](https://github.com/pjordan/agent-skills) — distributed by [TomeVault](https://tomevault.io).279<!-- tomevault:4.0:skill_md:2026-05-22 -->