Skills must not auto-merge PRs; stop at the PR and make merging opt-in #57
Closed
opened 2026-08-20 01:23:08 +00:00 by yousuf
·
2 comments
No Branch/Tag specified
main
feature/issue-264/verify-the-vision-tool-live-against-the-deepseek-a
feature/issue-263/list-the-vision-extension-in-the-repo-root-readme
feature/issue-262/write-extensions-vision-readme-md-the-10-section-p
feature/issue-261/wire-the-vision-extension-into-package-json-manife
feature/issue-260/implement-extensions-vision-index-ts-factory-regis
feature/issue-258/implement-extensions-vision-src-tool-ts-the-vision
feature/issue-257/implement-extensions-vision-src-client-ts-request
feature/issue-256/implement-extensions-vision-src-usage-ts-usage-map
feature/issue-255/implement-extensions-vision-src-images-ts-read-val
feature/issue-254/implement-extensions-vision-src-config-ts-env-reso
feature/issue-253/implement-extensions-vision-src-errors-ts-toolerro
feature/issue-252/penpot-add-text-stages-zero-area-auto-width-text-p
feature/issue-216/add-the-penpot-skill-and-extension-to-the-repo-roo
feature/issue-217/register-the-penpot-tests-in-npm-test-complete-the
feature/issue-215/write-the-penpot-skill-md-core-workflow-token-conv
feature/issue-214/implement-and-run-fetch-penpot-docs-mjs-and-commit
feature/issue-213/validate-screenshot-reconstruction-against-the-liv
feature/issue-212/add-the-image-to-design-workflow-to-skills-penpot
feature/issue-211/validate-svg-import-icon-and-illustration-against
feature/issue-210/implement-the-penpot-add-svg-tool-with-svg-raw-fal
feature/issue-209/implement-the-svg-to-shapes-converter-in-src-svg-t
feature/issue-208/validate-component-instancing-against-the-live-ins
feature/issue-207/implement-penpot-instance-component-with-id-remapp
feature/issue-206/author-and-commit-the-component-library-artifact-u
feature/issue-205/implement-file-library-linking-and-validate-the-ex
feature/issue-204/implement-penpot-export-library-sse-uri-plus-artif
feature/issue-203/implement-penpot-import-library-multipart-upload-p
feature/issue-202/implement-the-transit-decoder-and-sse-stream-parse
feature/issue-201/validate-a-full-composed-screen-one-commit-one-rev
feature/issue-200/implement-penpot-add-image-with-media-upload
feature/issue-199/implement-asset-reference-resolution-plus-penpot-a
feature/issue-198/implement-penpot-add-frame-with-auto-layout-props
feature/issue-197/validate-asset-creation-atomicity-and-write-safety
feature/issue-196/implement-the-designated-target-write-guard-with-a
feature/issue-195/implement-penpot-commit-with-revn-tracking-conflic
feature/issue-194/implement-the-staged-changeset-store-and-the-colou
feature/issue-193/validate-read-primitives-against-the-live-penpot-i
feature/issue-192/implement-the-penpot-list-library-tool-with-name-t
feature/issue-191/implement-the-penpot-get-file-tool-pages-objects-a
feature/issue-190/implement-the-penpot-list-projects-tool-teams-and
feature/issue-189/implement-the-penpot-whoami-tool-and-wire-the-exte
feature/issue-188/implement-the-rpc-client-and-error-decoding-in-src
feature/issue-187/implement-penpot-url-penpot-token-resolution-in-sr
feature/issue-186/scaffold-the-penpot-extension-directory-and-regist
feature/issue-172/add-end-to-end-main-tests-for-the-fj-rg-tool-state
feature/issue-171/make-reminder-report-dynamic-install-skip-counts-r
feature/issue-170/wire-settings-json-filter-rewrite-into-dedupeandre
feature/issue-169/implement-buildpackagefilters-with-exhaustive-unit
feature/issue-168/refactor-preflight-to-skip-warn-for-missing-fj-rg
feature/issue-167/add-fj-rg-tool-detection-helpers-rgavailable-detec
feature/issue-148/reconcile-design-md-and-implementation-plan-with-t
feature/issue-146/verify-extension-load-behavior-with-and-without-mo
feature/issue-145/write-extensions-mongodb-readme-md
feature/issue-144/write-tool-description-promptsnippet-guidance-for
feature/issue-143/implement-index-ts-async-factory-lifecycle-with-te
feature/issue-142/implement-the-mongo-list-collections-tool-with-uni
feature/issue-141/implement-the-mongo-count-tool-with-unit-tests
feature/issue-140/implement-the-mongo-find-tool-with-unit-tests
feature/issue-139/implement-src-errors-ts-with-unit-tests-toolerror
feature/issue-138/implement-src-serialize-ts-with-unit-tests-ejson-t
feature/issue-136/implement-src-env-ts-with-unit-tests-mongodb-uri-r
feature/issue-135/register-the-mongodb-extension-in-the-repo-root-pa
feature/issue-133/initialize-the-extensions-mongodb-package-package
feature/issue-116/src-actions-ts-downloadrunlogs-zip-guarded-unzip-c
feature/issue-115/src-actions-ts-downloadjoblog-cache-first-attempt
feature/issue-114/src-actions-ts-metadata-queries-listactionruns-get
feature/issue-113/src-actionscache-ts-cache-paths-cache-first-read-w
feature/issue-112/add-zip-extraction-dependency-adm-zip-vs-yauzl
feature/issue-111/tracking-forgejo-actions-tooling-read-only-runs-jo
feature/issue-93/add-unit-tests-for-scripts-local-install-mjs-node
feature/issue-92/validate-install-local-end-to-end-on-the-dev-machi
feature/issue-90/implement-pi-registration-with-url-dedupe-and-relo
feature/issue-89/validate-install-local-from-a-scratch-clone-fresh
feature/issue-88/implement-git-pull-and-npm-install-steps-in-script
feature/issue-74/write-victorialogs-readme-md-and-reconcile-design
feature/issue-73/wire-up-index-ts-extension-factory-and-register-al
feature/issue-72/implement-logs-facets-tool-src-tools-facets-ts
feature/issue-71/implement-logs-hits-tool-src-tools-hits-ts
feature/issue-70/implement-logs-search-tool-src-tools-search-ts
feature/issue-69/implement-parsejsonlines-helper-in-src-client-ts
feature/issue-68/implement-victorialogsrequest-in-src-client-ts
feature/issue-67/implement-resolvebaseurl-in-src-env-ts
feature/issue-66/implement-totoolerror-in-src-errors-ts
feature/issue-65/implement-src-defaults-ts-shared-constants-and-app
feature/issue-64/scaffold-the-victorialogs-pi-extension-project
feature/issue-53/skip-issue-creation-for-chore-documentation-commit
feature/issue-45/fix-local-install-preflight-env-var-requirements-s
feature/issue-41/add-npm-run-local-install-script-to-update-and-ins
feature/issue-26/cross-reference-forgejo-list-milestones-from-issue
feature/issue-25/add-forgejo-milestone-delete-tool
feature/issue-24/add-forgejo-milestone-close-and-forgejo-milestone
feature/issue-23/add-forgejo-milestone-edit-tool
feature/issue-22/add-forgejo-milestone-view-tool
feature/issue-21/add-forgejo-list-milestones-tool
feature/issue-20/add-forgejo-milestone-create-tool
feature/issue-18/add-forgejo-label-create-tool
feature/issue-29/bug-forgejo-issue-create-view-edit-close-etc-crash
No results found.
Labels
No labels
bug
chore
documentation
enhancement
feature
ready
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
david/pi-extensions-and-skills#57
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
commit-changes,commit-docsandfurnish-repocurrently squash-merge the PRthemselves, gated only on CI. There is no review gate: the human never sees the PR
before it lands on the default branch.
Merging should not be a skill's decision. Change the default to stop at the PR, and
make merging opt-in.
Why this is wrong today
commit-changes/SKILL.mdStep 5 states it explicitly:Two problems:
secret-detection only — no build, no tests. "CI green" there means "no credentials
committed", not "this change is correct". The skill merged on that basis.
--auto-merge/PILOOP_AUTO_MERGE(defaultfalse),pollUntilMergeable, andgithubMergePoller/gitlabMergePoller. Without--auto-mergepi-loop deliberatelyleaves a draft MR for review — and a skill that squash-merges inside that stage
silently overrides that decision. Today they are two independent merge authorities
racing each other.
Decision
Skills never merge. They stop at the PR and report the URL. Same rule in every
context — plain pi and pi-loop alike.
This does not regress pi-loop: it merges via its own poller, not by asking a skill.
--auto-merge--auto-mergeOverride precedence
piloop-config.yaml→auto-merge: true→ merge (reuses the filecreate-issues/SKILL.md§2.1 already reads, and pi-loop's own key name)Unspecified means stop, not prompt. An interactive confirmation would hang a
non-interactive pi-loop run; stopping with a URL is safe in every context.
CI remains a hard gate on the override path — if merging was requested and CI is
red or still running, still stop.
Not implemented: pi-loop env detection
A rule like "merge when inside pi-loop" was considered and rejected as
unimplementable: pi-loop composes stage prompts in-process and exports no
PILOOP_*variable into the agent environment, so a skill has nothing to test and would be
guessing. Making the rule context-independent removes the need entirely.
If per-context behaviour is ever wanted, the prerequisite is a pi-loop change to pass
PILOOP_AUTO_MERGEthrough to the agent env — tracked separately, not here.Scope
Each skill asserts its merge behaviour in four places; all must change together or
the file contradicts itself (the frontmatter
descriptionmatters most — it is alwaysin the agent's context and is what drives the behaviour):
skills/commit-changes/SKILL.md— frontmatter description, workflow overview, Step 5, failure-modes tableskills/commit-docs/SKILL.md— frontmatter description, overview, Step 4, failure-modes tableskills/furnish-repo/SKILL.md— frontmatter description, overview, §3.7, confirmation prompt text, failure-modes tableAGENTS.md— "PRs are squash-merged and the source branch is deleted" needs to say by whomAcceptance criteria
piloop-config.yaml'sauto-merge: trueboth still mergeDecision revised after discussion with the repo owner.
The original issue below specified that skills should never merge and never ask —
open the PR and stop, full stop. The owner asked for a middle ground between
merge-by-default and never-merge: the agent opens the MR, then prompts the user to
merge or not.
That is now the implemented behaviour in PR #58:
piloop-config.yaml→auto-merge: trueWith two overrides:
prompt resolves to no; the agent must never answer on the user's behalf.
pi --print/-pand scripted invocationsskip the prompt and stop at the PR.
CI remains a hard gate on every merge path, and the prompt is not offered when CI is red.
Correction to the "Not implemented" section below
The original issue justified banning prompts with "an interactive confirmation would
hang a non-interactive pi-loop run". That premise was false. pi-loop does not
invoke these skills — it bundles its own stage skills and ships via deterministic code,
and its ADR-014 explicitly rejected agent-driven shipping through
gh/glab/fjasbreaking its REST-only invariant. The real hang risk is
pi --print, which thenon-interactive rule now handles directly.
The rest of the issue — the problem statement, the CI-is-a-weak-proxy argument, and the
scope/acceptance list — still stands.
Acceptance criteria, as revised
piloop-config.yaml'sauto-merge: trueskip the promptScope correction.
The issue text and my earlier comment both reasoned about pi-loop — its
--auto-mergesubsystem, its bundled stage skills, and a
piloop-config.yamloverride. That was outof scope.
This change is for the skills as used with pi. Other tooling's behaviour is unchanged
and is not referenced.
Removed in
31624c6:piloop-config.yaml→auto-merge: trueoverride. This was the more substantiveissue: it made a pi-only skill read another tool's config file and gave an existing
key a second, skill-specific meaning — so a user setting it for that tool would have
silently changed how these skills behave under pi.
mainhad zero such references in these three skills, so this restores the intendedseparation rather than creating one.
Final behaviour
Plus: never merge without a clear human yes (silence and ambiguity resolve to no);
non-interactive runs (
pi --print/-p) skip the prompt and stop at the PR; CI is ahard gate on every merge path.
skills/create-issues/SKILL.mdis deliberately untouched — its §2.1 config readpredates this work and is a separate, pre-existing coupling.
david referenced this issue2026-08-27 23:59:07 +00:00