feat: PM-Agent also need to look at PR comments
gate / gate (pull_request) Successful in 2m58s
images / images (pull_request) Successful in 1m6s
gate / conformance (pull_request) Has been skipped

From Gitea issue #116.

Authored by the PM agent's worker; the merge gate is the approver. Refs #116.

Agent: pm-agent (issue #116, mode revise)
This commit is contained in:
pm-agent committed 2026-11-07 06:02:58 +00:00
1 parent 2fdb95393c
commit e8e9de8611
7 files changed
+471 -189

No files matched your search

+134 -32
View File
@@ -10,7 +10,7 @@
"swagger for the 1.24 line (Comment, PullReview, PullReviewComment, NotificationThread).",
"They were NOT recorded from a live server: the branch that wrote them held no Gitea",
"credential. So a passing case proves that this program's PARSING and TRIGGER LOGIC are",
"right for that shape -- the loop guard, the idempotency skip, the continuation policy --",
"right for that shape -- the loop guard, the mention match, the idempotency skip --",
"and proves nothing about whether Gitea emits that shape. Only unused-and-wrong field",
"names can hide here, and the remedy is cheap: capture one real response with the curl",
"commands in platform/pm-agent/README.md and replace the objects below with it. Fields",
@@ -23,12 +23,25 @@
"",
"`expect.threads` is in the order plan_pr_replies returns: NEWEST-ANCHORED FIRST.",
"",
"THE CONTINUATION POLICY THESE PIN. A thread becomes a conversation the PM is part of",
"at the first mention in it (or at a marker in one of the PM's own comments), and every",
"later non-bot comment in that thread then triggers without a new mention -- the",
"operator's wording on issue #116, answer (4'). Cases (i) and (o) are the two edges:",
"comments AFTER the mention are in, comments BEFORE it are not. Case (l) pins that this",
"is per thread, not per pull request."
"THE TRIGGER RULE THESE PIN: an EXPLICIT MENTION OF THE BOT IS THE ONLY TRIGGER. A",
"comment that does not spell the handle out is never answered, however recently the bot",
"was mentioned or replied nearby, and it costs no model call. The operator settled this",
"on issue #116 -- \"since there is no threads and the PR comments are flat, then the",
"pm-agent should be looking for explicit mentions rather than a single mention and",
"continued scrapping of comments within the PR in perpetuity\" -- withdrawing the earlier",
"\"a thread that starts with a mention should continue\" answer. The cases that used to",
"assert continuation are INVERTED rather than deleted, so the old behaviour cannot creep",
"back unnoticed: (e) a conversation follow-up after a reply, (m) an inline follow-up",
"after an inline reply and (l) an unmentioned inline comment on a pull request whose",
"conversation was answered all expect NO reply. (i) is the burst shape the operator",
"described -- three comments, only the first mentioning the bot -- and is exactly one",
"reply, to the first. (q) pins the consequence that is now closed: another automation",
"commenting on a once-mentioned pull request draws nothing.",
"",
"What a mention still batches: (p) two UNANSWERED mentions in one thread are one reply",
"naming both, because the at-most-once-reply model is per reply and not per mention.",
"(r) shows a mention is repeatable -- a fresh mention after an answered one gets its own",
"reply, keyed only to itself."
],
"bot_login": "pm-agent",
"cases": [
@@ -134,7 +147,7 @@
"expect": {"threads": []}
},
{
"name": "(e) a follow-up with NO mention continues a thread the bot has replied in",
"name": "(e) a conversation follow-up with NO mention is NOT actionable, even after the bot replied",
"pull": 124,
"comments": [
{
@@ -158,11 +171,7 @@
],
"reviews": [],
"review_comments": {},
"expect": {
"threads": [
{"thread": "conversation", "reason": "continuation", "keys": ["comment-9032"]}
]
}
"expect": {"threads": []}
},
{
"name": "(f) an unrelated comment on an unrelated PR triggers nothing",
@@ -229,7 +238,7 @@
}
},
{
"name": "(i) a burst of three unanswered comments is ONE reply covering all three keys",
"name": "(i) a burst of three where only the FIRST mentions the bot is ONE reply, to that first comment",
"pull": 128,
"comments": [
{
@@ -255,11 +264,7 @@
"review_comments": {},
"expect": {
"threads": [
{
"thread": "conversation",
"reason": "mention",
"keys": ["comment-9070", "comment-9071", "comment-9072"]
}
{"thread": "conversation", "reason": "mention", "keys": ["comment-9070"]}
]
}
},
@@ -328,7 +333,7 @@
}
},
{
"name": "(l) continuation is PER THREAD: a reply in the conversation does not open the inline thread",
"name": "(l) an answered conversation mention does not make an unmentioned inline comment actionable",
"pull": 131,
"comments": [
{
@@ -360,7 +365,7 @@
"id": 7720,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T10:55:00Z",
"body": "no mention here, and the bot has never replied in THIS thread",
"body": "no mention here, so nothing to answer -- not even though the bot replied in the conversation",
"path": "ci/lint.sh",
"position": 3,
"pull_request_review_id": 404
@@ -370,7 +375,7 @@
"expect": {"threads": []}
},
{
"name": "(m) an inline thread the bot has replied in continues without a mention",
"name": "(m) an inline thread the bot has replied in does NOT continue without a new mention",
"pull": 132,
"comments": [],
"reviews": [
@@ -427,22 +432,14 @@
"id": 7732,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T11:05:00Z",
"body": "and the worker cap?",
"body": "and the worker cap? (no mention -- a genuinely threaded inline reply is still not a trigger)",
"path": "platform/pm-agent/configmap.yaml",
"position": 88,
"pull_request_review_id": 407
}
]
},
"expect": {
"threads": [
{
"thread": "inline:platform/pm-agent/configmap.yaml@88",
"reason": "continuation",
"keys": ["review-comment-7732"]
}
]
}
"expect": {"threads": []}
},
{
"name": "(o) a comment made BEFORE the mention is not pulled into the conversation",
@@ -510,6 +507,111 @@
}
]
}
},
{
"name": "(p) two UNANSWERED mentions in one thread are ONE reply naming both, anchored on the newer",
"pull": 135,
"comments": [
{
"id": 9100,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T11:30:00Z",
"body": "@pm-agent does the approval stage apply here?"
},
{
"id": 9101,
"user": {"login": "someone-else", "id": 5},
"created_at": "2026-11-07T11:31:00Z",
"body": "I think it does not, but I am not sure. (no mention, so not answered and not keyed)"
},
{
"id": 9102,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T11:32:00Z",
"body": "@pm-agent and while you are here, which stages skipped?"
}
],
"reviews": [],
"review_comments": {},
"expect": {
"threads": [
{
"thread": "conversation",
"reason": "mention",
"keys": ["comment-9100", "comment-9102"]
}
]
}
},
{
"name": "(q) another automation commenting on a once-mentioned pull request draws nothing",
"pull": 136,
"comments": [
{
"id": 9110,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T11:40:00Z",
"body": "@pm-agent is this one safe to merge?"
},
{
"id": 9111,
"user": {"login": "pm-agent", "id": 7},
"created_at": "2026-11-07T11:41:00Z",
"body": "Yes.\n\n<!-- pm-agent:replied-to=comment-9110 -->"
},
{
"id": 9112,
"user": {"login": "renovate", "id": 9},
"created_at": "2026-11-07T11:50:00Z",
"body": "Edited/Blocked: this PR is edited, Renovate will not update it."
},
{
"id": 9113,
"user": {"login": "gitea-actions", "id": 11},
"created_at": "2026-11-07T11:55:00Z",
"body": "gate / gate (pull_request) succeeded in 1m35s."
}
],
"reviews": [],
"review_comments": {},
"expect": {"threads": []}
},
{
"name": "(r) a mention is repeatable: a fresh one after an answered one gets its own reply",
"pull": 137,
"comments": [
{
"id": 9120,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T12:00:00Z",
"body": "@pm-agent first question."
},
{
"id": 9121,
"user": {"login": "pm-agent", "id": 7},
"created_at": "2026-11-07T12:01:00Z",
"body": "First answer.\n\n<!-- pm-agent:replied-to=comment-9120 -->"
},
{
"id": 9122,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T12:05:00Z",
"body": "unrelated chatter, nobody tagged"
},
{
"id": 9123,
"user": {"login": "jakman85", "id": 1},
"created_at": "2026-11-07T12:10:00Z",
"body": "@pm-agent second question, asked explicitly."
}
],
"reviews": [],
"review_comments": {},
"expect": {
"threads": [
{"thread": "conversation", "reason": "mention", "keys": ["comment-9123"]}
]
}
}
],
"notification_subjects": [