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)
639 lines
21 KiB
JSON
639 lines
21 KiB
JSON
{
|
|
"_what_this_is": [
|
|
"Fixtures for the pull-request-mention trigger in infra/agent/pm-dispatch.py, driven by",
|
|
"`PM_SELFTEST=1 pm-dispatch` (and therefore by the Containerfile's verify stage and by",
|
|
"infra/agent/build-image.sh). Each case feeds normalize_pr_entries() + plan_pr_replies()",
|
|
"and asserts the EXACT set of threads that would be answered, with which comment keys.",
|
|
"",
|
|
"HOW HONEST THESE ARE, stated plainly because it matters for what a green selftest",
|
|
"proves. These objects are written to the field names and types in Gitea's published",
|
|
"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 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",
|
|
"this program never reads are kept anyway, so the diff against a real capture is small.",
|
|
"",
|
|
"Only the fields the dispatcher reads are load-bearing:",
|
|
" Comment ............. id, user.login, created_at, body",
|
|
" PullReview .......... id, user.login, submitted_at, body, comments_count",
|
|
" PullReviewComment ... id, user.login, created_at, body, path, position",
|
|
"",
|
|
"`expect.threads` is in the order plan_pr_replies returns: NEWEST-ANCHORED FIRST.",
|
|
"",
|
|
"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": [
|
|
{
|
|
"name": "(a) a mention in a PR conversation comment is detected",
|
|
"pull": 120,
|
|
"comments": [
|
|
{
|
|
"id": 9001,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:00:00Z",
|
|
"updated_at": "2026-11-07T09:00:00Z",
|
|
"body": "@pm-agent can you look at the retry loop in cycle() here? I think it double-counts."
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "conversation", "reason": "mention", "keys": ["comment-9001"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(b) a mention in an inline review comment is detected, as its own thread",
|
|
"pull": 121,
|
|
"comments": [],
|
|
"reviews": [
|
|
{
|
|
"id": 400,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T09:10:00Z",
|
|
"comments_count": 1
|
|
}
|
|
],
|
|
"review_comments": {
|
|
"400": [
|
|
{
|
|
"id": 7701,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:10:00Z",
|
|
"body": "@pm-agent this cap looks off by one.",
|
|
"path": "infra/agent/pm-dispatch.py",
|
|
"position": 42,
|
|
"original_position": 42,
|
|
"pull_request_review_id": 400,
|
|
"diff_hunk": "@@ -1,3 +1,4 @@"
|
|
}
|
|
]
|
|
},
|
|
"expect": {
|
|
"threads": [
|
|
{
|
|
"thread": "inline:infra/agent/pm-dispatch.py@42",
|
|
"reason": "mention",
|
|
"keys": ["review-comment-7701"]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(c) a comment authored by the bot itself is ignored, mention and all",
|
|
"pull": 122,
|
|
"comments": [
|
|
{
|
|
"id": 9010,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T09:20:00Z",
|
|
"body": "Worth a look: @pm-agent should re-read this once the gate is green."
|
|
},
|
|
{
|
|
"id": 9011,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T09:21:00Z",
|
|
"body": "A plain status note from the agent, no mention at all."
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(d) an already-processed comment id is skipped",
|
|
"pull": 123,
|
|
"comments": [
|
|
{
|
|
"id": 9020,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:30:00Z",
|
|
"body": "@pm-agent what does the approval stage need here?"
|
|
},
|
|
{
|
|
"id": 9021,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T09:31:00Z",
|
|
"body": "It needs a review from someone who is not the author.\n\n_Posted by the PM agent._\n\n<!-- pm-agent:replied-to=comment-9020 -->"
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(e) a conversation follow-up with NO mention is NOT actionable, even after the bot replied",
|
|
"pull": 124,
|
|
"comments": [
|
|
{
|
|
"id": 9030,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:40:00Z",
|
|
"body": "@pm-agent is this safe to merge on a green gate?"
|
|
},
|
|
{
|
|
"id": 9031,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T09:41:00Z",
|
|
"body": "Yes, nothing here is a sensitive path.\n\n<!-- pm-agent:replied-to=comment-9030 -->"
|
|
},
|
|
{
|
|
"id": 9032,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:45:00Z",
|
|
"body": "And the conformance gap? No mention in this one on purpose."
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(f) an unrelated comment on an unrelated PR triggers nothing",
|
|
"pull": 125,
|
|
"comments": [
|
|
{
|
|
"id": 9040,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T09:50:00Z",
|
|
"body": "Rebased onto main; the cilium bump is in."
|
|
},
|
|
{
|
|
"id": 9041,
|
|
"user": {"login": "renovate", "id": 9},
|
|
"created_at": "2026-11-07T09:51:00Z",
|
|
"body": "Edited/Blocked: this PR is edited, Renovate will not update it."
|
|
}
|
|
],
|
|
"reviews": [
|
|
{
|
|
"id": 401,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "Looks fine to me.",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T09:52:00Z",
|
|
"comments_count": 0
|
|
}
|
|
],
|
|
"review_comments": {},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(g) a near-miss handle is not a mention: @pm-agent-worker and an email-like form",
|
|
"pull": 126,
|
|
"comments": [
|
|
{
|
|
"id": 9050,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:00:00Z",
|
|
"body": "The Job runs as @pm-agent-worker, and the log line was mailed to [email protected]. Also pm-agent without the at-sign."
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(h) a marker pasted by someone who is NOT the bot does not suppress a mention",
|
|
"pull": 127,
|
|
"comments": [
|
|
{
|
|
"id": 9060,
|
|
"user": {"login": "drive-by", "id": 4},
|
|
"created_at": "2026-11-07T10:10:00Z",
|
|
"body": "@pm-agent read this.\n\n<!-- pm-agent:replied-to=comment-9060 -->"
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "conversation", "reason": "mention", "keys": ["comment-9060"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(i) a burst of three where only the FIRST mentions the bot is ONE reply, to that first comment",
|
|
"pull": 128,
|
|
"comments": [
|
|
{
|
|
"id": 9070,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:20:00Z",
|
|
"body": "@pm-agent one question:"
|
|
},
|
|
{
|
|
"id": 9071,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:20:30Z",
|
|
"body": "actually two."
|
|
},
|
|
{
|
|
"id": 9072,
|
|
"user": {"login": "someone-else", "id": 5},
|
|
"created_at": "2026-11-07T10:21:00Z",
|
|
"body": "three, sorry."
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "conversation", "reason": "mention", "keys": ["comment-9070"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(j) a mention in a review BODY is a conversation trigger, not an inline one",
|
|
"pull": 129,
|
|
"comments": [],
|
|
"reviews": [
|
|
{
|
|
"id": 402,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "@pm-agent summarise what this changes, please.",
|
|
"state": "REQUEST_CHANGES",
|
|
"submitted_at": "2026-11-07T10:30:00Z",
|
|
"comments_count": 0
|
|
}
|
|
],
|
|
"review_comments": {},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "conversation", "reason": "mention", "keys": ["review-402"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(k) two inline threads on one file are separate threads; the newest anchor comes first",
|
|
"pull": 130,
|
|
"comments": [],
|
|
"reviews": [
|
|
{
|
|
"id": 403,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T10:40:00Z",
|
|
"comments_count": 2
|
|
}
|
|
],
|
|
"review_comments": {
|
|
"403": [
|
|
{
|
|
"id": 7710,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:40:00Z",
|
|
"body": "@pm-agent why this order?",
|
|
"path": "ci/gate.sh",
|
|
"position": 10,
|
|
"pull_request_review_id": 403
|
|
},
|
|
{
|
|
"id": 7711,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:41:00Z",
|
|
"body": "@pm-agent and this skip?",
|
|
"path": "ci/gate.sh",
|
|
"position": 55,
|
|
"pull_request_review_id": 403
|
|
}
|
|
]
|
|
},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "inline:ci/gate.sh@55", "reason": "mention", "keys": ["review-comment-7711"]},
|
|
{"thread": "inline:ci/gate.sh@10", "reason": "mention", "keys": ["review-comment-7710"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(l) an answered conversation mention does not make an unmentioned inline comment actionable",
|
|
"pull": 131,
|
|
"comments": [
|
|
{
|
|
"id": 9080,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:50:00Z",
|
|
"body": "@pm-agent have a look."
|
|
},
|
|
{
|
|
"id": 9081,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T10:51:00Z",
|
|
"body": "Looked.\n\n<!-- pm-agent:replied-to=comment-9080 -->"
|
|
}
|
|
],
|
|
"reviews": [
|
|
{
|
|
"id": 404,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T10:55:00Z",
|
|
"comments_count": 1
|
|
}
|
|
],
|
|
"review_comments": {
|
|
"404": [
|
|
{
|
|
"id": 7720,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T10:55:00Z",
|
|
"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
|
|
}
|
|
]
|
|
},
|
|
"expect": {"threads": []}
|
|
},
|
|
{
|
|
"name": "(m) an inline thread the bot has replied in does NOT continue without a new mention",
|
|
"pull": 132,
|
|
"comments": [],
|
|
"reviews": [
|
|
{
|
|
"id": 405,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T11:00:00Z",
|
|
"comments_count": 1
|
|
},
|
|
{
|
|
"id": 406,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T11:01:00Z",
|
|
"comments_count": 1
|
|
},
|
|
{
|
|
"id": 407,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T11:05:00Z",
|
|
"comments_count": 1
|
|
}
|
|
],
|
|
"review_comments": {
|
|
"405": [
|
|
{
|
|
"id": 7730,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T11:00:00Z",
|
|
"body": "@pm-agent is this cap right?",
|
|
"path": "platform/pm-agent/configmap.yaml",
|
|
"position": 88,
|
|
"pull_request_review_id": 405
|
|
}
|
|
],
|
|
"406": [
|
|
{
|
|
"id": 7731,
|
|
"user": {"login": "pm-agent", "id": 7},
|
|
"created_at": "2026-11-07T11:01:00Z",
|
|
"body": "It matches the admission policy.\n\n<!-- pm-agent:replied-to=review-comment-7730 -->",
|
|
"path": "platform/pm-agent/configmap.yaml",
|
|
"position": 88,
|
|
"pull_request_review_id": 406
|
|
}
|
|
],
|
|
"407": [
|
|
{
|
|
"id": 7732,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T11:05:00Z",
|
|
"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": []}
|
|
},
|
|
{
|
|
"name": "(o) a comment made BEFORE the mention is not pulled into the conversation",
|
|
"pull": 134,
|
|
"comments": [
|
|
{
|
|
"id": 9090,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T11:20:00Z",
|
|
"body": "Opening this for review."
|
|
},
|
|
{
|
|
"id": 9091,
|
|
"user": {"login": "someone-else", "id": 5},
|
|
"created_at": "2026-11-07T11:21:00Z",
|
|
"body": "LGTM."
|
|
},
|
|
{
|
|
"id": 9092,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T11:22:00Z",
|
|
"body": "@pm-agent what do you think?"
|
|
}
|
|
],
|
|
"reviews": [],
|
|
"review_comments": {},
|
|
"expect": {
|
|
"threads": [
|
|
{"thread": "conversation", "reason": "mention", "keys": ["comment-9092"]}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "(n) a position-less inline comment still lands in a stable thread (review-id fallback)",
|
|
"pull": 133,
|
|
"comments": [],
|
|
"reviews": [
|
|
{
|
|
"id": 408,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"body": "",
|
|
"state": "COMMENT",
|
|
"submitted_at": "2026-11-07T11:10:00Z",
|
|
"comments_count": 1
|
|
}
|
|
],
|
|
"review_comments": {
|
|
"408": [
|
|
{
|
|
"id": 7740,
|
|
"user": {"login": "jakman85", "id": 1},
|
|
"created_at": "2026-11-07T11:10:00Z",
|
|
"body": "@pm-agent the whole file, not a line.",
|
|
"path": "runbooks/pm-agent.md",
|
|
"pull_request_review_id": 408
|
|
}
|
|
]
|
|
},
|
|
"expect": {
|
|
"threads": [
|
|
{
|
|
"thread": "inline:runbooks/pm-agent.md@review-408",
|
|
"reason": "mention",
|
|
"keys": ["review-comment-7740"]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"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": [
|
|
{
|
|
"_note": "NotificationThread.subject shapes discover_pr_candidates must resolve to an index.",
|
|
"url": "http://gitea.gitea.svc.cluster.local:3000/api/v1/repos/Home-Network/home-network-k3s-impl/issues/120",
|
|
"expect_index": 120
|
|
},
|
|
{
|
|
"url": "http://gitea.gitea.svc.cluster.local:3000/api/v1/repos/Home-Network/home-network-k3s-impl/pulls/121",
|
|
"expect_index": 121
|
|
},
|
|
{
|
|
"_note": "A comment-anchored URL must still yield the PR index, never the comment id.",
|
|
"url": "http://gitea.gitea.svc.cluster.local:3000/api/v1/repos/Home-Network/home-network-k3s-impl/issues/122/comments/9001",
|
|
"expect_index": 122
|
|
},
|
|
{
|
|
"_note": "Nothing resolvable: discovery must skip it rather than guess.",
|
|
"url": "http://gitea.gitea.svc.cluster.local:3000/api/v1/repos/Home-Network/home-network-k3s-impl",
|
|
"expect_index": null
|
|
}
|
|
]
|
|
}
|