You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The pr-management-* skills (triage, code-review, quick-merge, stats) are hardwired to GitHub: gh pr …, owner/name repo form, GraphQL has_next_page pagination, a GitHub-login "viewer". There is no abstract "pull request" binding the way tools/github/source-control.md abstracts VCS operations.
Consequences:
contract:tracker (implemented by tools/github, tools/jira, tools/github-body-field, tools/github-rollup) abstracts issues only — not the PR/review surface.
A JIRA-tracker project already can't use pr-management-* today (JIRA has issues, not PRs).
The ASF-world equivalents of a PR — a patch attached to a JIRA/Bugzilla issue, or a [PATCH] thread on dev@ — have no first-class model in the framework.
Proposal: a new peer contract contract:change-proposal
Model the unit that is forge-shaped today (a PR) as a backend-neutral change proposal: a diff + metadata + a review/discussion thread + a lifecycle, decoupled from where it lives. This is a peer of contract:tracker and contract:source-control, not an extension of either. tools/asf-svn needs no change — it already exposes the land primitive (svn patch + confirmed svn commit).
Minimal operation set
Abstract op
GitHub PR
GitLab MR
JIRA + SVN (patch-on-issue)
dev@[PATCH] thread
list_open
gh pr list
MR list
JQL attachment + "patch available"
PonyMail thread search
get(id) → diff + meta
gh pr diff/view
MR diff
download .patch attachment
extract patch from mbox
get_discussion
PR comments/reviews
MR notes
JIRA comments
thread replies (ponymail)
post_review
gh pr review
MR note
JIRA comment
mail-draft reply
land
merge PR
merge MR
asf-svn: svn patch + confirmed commit
same → asf-svn
reject/close
close PR
close MR
JIRA transition + comment
reply, no commit
status (CI / mergeable)
checks API
pipelines
— / Jenkins link
—
The two right-hand columns are the SVN-first ASF paths; both delegate land to asf-svn's source-control binding, gated by asf-svn/authorization.md (committer check). Clean seam: the change-proposal adapter owns review/triage; asf-svn owns apply/commit.
Tool + config layout
tools/change-proposal/ # contract:change-proposal — pure interface spec (like tools/cve-tool/)
tools/github/ # ALSO implements contract:change-proposal (PR backend)
tools/jira-patch/ # JIRA patch-on-issue adapter → lands via asf-svn
tools/mail-patch/ # dev@ [PATCH] thread adapter → reuses ponymail + mail-draft, lands via asf-svn
Phase 1 — define contract:change-proposal; make tools/github implement it; refactor onlypr-management-triage to the binding (proves the abstraction, zero behavior change on GitHub).
Phase 2 — tools/jira-patch adapter + land → asf-svn wiring; validate end-to-end on a real JIRA+SVN project.
Phase 3 — tools/mail-patch (dev@ threads) reusing ponymail / mail-draft. Hardest, because there is no proposal object — identity is synthesized from thread-id + message-id.
Open questions
Diff identity across backends — GitHub PR = branch; JIRA patch = file; mail patch = git format-patch / raw svn diff. Needs a normalized diff representation and a stable proposal-id scheme (esp. mail, where one proposal = a thread carrying patch v1/v2/v3).
No "mergeable"/CI equivalent off GitHub — triage classification that leans on check-status must degrade gracefully.
Apply idempotency & conflicts — svn patch partial-apply/reject is messier than a server-side merge; land needs a defined failure contract.
Authorization & attribution — mail/JIRA contributors aren't committers; land must resolve the acting committer via asf-svn/authorization.md, and patch-author ≠ committer attribution must survive into the commit message.
Problem
The
pr-management-*skills (triage,code-review,quick-merge,stats) are hardwired to GitHub:gh pr …,owner/namerepo form, GraphQLhas_next_pagepagination, a GitHub-login "viewer". There is no abstract "pull request" binding the waytools/github/source-control.mdabstracts VCS operations.Consequences:
contract:tracker(implemented bytools/github,tools/jira,tools/github-body-field,tools/github-rollup) abstracts issues only — not the PR/review surface.pr-management-*today (JIRA has issues, not PRs).tools/asf-svn(feat(tools/asf-svn): ASF SVN-based tool adapter (svn.apache.org + dist.apache.org), full capability surface like tools/github #608, partially landed in feat(tools/asf-svn): ASF SVN-based tool adapter (svn.apache.org + dist.apache.org), full capability surface like tools/github (#608) #620) adds source-control +dist.apache.org+ authorization, but no review surface. An SVN-first ASF project (source onsvn.apache.org, no GitHub mirror) has neither a PR object nor a patch-review surface, so none of thepr-management-*skills apply.The ASF-world equivalents of a PR — a patch attached to a JIRA/Bugzilla issue, or a
[PATCH]thread ondev@— have no first-class model in the framework.Proposal: a new peer contract
contract:change-proposalModel the unit that is forge-shaped today (a PR) as a backend-neutral change proposal: a diff + metadata + a review/discussion thread + a lifecycle, decoupled from where it lives. This is a peer of
contract:trackerandcontract:source-control, not an extension of either.tools/asf-svnneeds no change — it already exposes thelandprimitive (svn patch+ confirmedsvn commit).Minimal operation set
dev@[PATCH]threadlist_opengh pr listattachment+ "patch available"get(id)→ diff + metagh pr diff/view.patchattachmentget_discussionpost_reviewgh pr reviewmail-draftreplylandasf-svn:svn patch+ confirmed commitasf-svnreject/closestatus(CI / mergeable)The two right-hand columns are the SVN-first ASF paths; both delegate
landtoasf-svn's source-control binding, gated byasf-svn/authorization.md(committer check). Clean seam: the change-proposal adapter owns review/triage;asf-svnowns apply/commit.Tool + config layout
Phasing
contract:change-proposal; maketools/githubimplement it; refactor onlypr-management-triageto the binding (proves the abstraction, zero behavior change on GitHub).tools/jira-patchadapter +land→asf-svnwiring; validate end-to-end on a real JIRA+SVN project.tools/mail-patch(dev@threads) reusingponymail/mail-draft. Hardest, because there is no proposal object — identity is synthesized from thread-id + message-id.Open questions
git format-patch/ rawsvn diff. Needs a normalized diff representation and a stable proposal-id scheme (esp. mail, where one proposal = a thread carrying patch v1/v2/v3).svn patchpartial-apply/reject is messier than a server-side merge;landneeds a defined failure contract.landmust resolve the acting committer viaasf-svn/authorization.md, and patch-author ≠ committer attribution must survive into the commit message.Relationships
tools/asf-svnfull surface; partially landed in feat(tools/asf-svn): ASF SVN-based tool adapter (svn.apache.org + dist.apache.org), full capability surface like tools/github (#608) #620) for thelandprimitive and authorization.contract:change-proposalbackend; worth aligning the interface so feat(tools/sourcehut): SourceHut (sr.ht) forge bridge — Git + Hg, email-patch review #607 implements this contract rather than a one-off.