refuse close and reopen words in caller text; only madtea writes the Closes lines #817

Closed
opened 2026-10-20 00:27:52 +00:00 by hexajon · 2 comments
Owner

The forge closes an issue when a close word sits right before its reference in a PR title, a PR body, a comment on a PR, or a commit message that reaches the default branch. The match is loose. does not close #N closes #N, and Closes #A, #B closes only #A. My agents get this wrong all the time, so issues close by mistake or stay open.

Decision: no text that a caller gives madtea may put a close or reopen word right before an issue reference. Only madtea writes close lines, from its own closes list.

Forge facts, from the Forgejo v15 and Gitea main source:

  • Close words: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved. Reopen words: reopen, reopens, reopened.
  • The forge matches (?i)(?:\s|^|\(|\[)(WORD):? $ against the text just before each #N or owner/repo#N.
  • Close actions come only from a PR (title, body, comments) and from commits on the default branch. An issue body or an issue comment never closes anything. The ban covers those too, so the habit never forms.
  • A server can change the lists in app.ini (CLOSE_KEYWORDS, REOPEN_KEYWORDS), and no API shows them. madtea checks the 12 default words. A server with custom words is a known gap.

Scope: every text a caller gives madtea, on the CLI and MCP: PR title and body, commit, merge and squash messages, issue bodies, comments, close reasons, and raw API writes to those endpoints. The refusal names the word and the reference, and points at closes=.

This adds a new limit to the one write guard of docs/decisions/0046. It changes no recorded decision.

The forge closes an issue when a close word sits right before its reference in a PR title, a PR body, a comment on a PR, or a commit message that reaches the default branch. The match is loose. `does not close #N` closes #N, and `Closes #A, #B` closes only #A. My agents get this wrong all the time, so issues close by mistake or stay open. Decision: no text that a caller gives madtea may put a close or reopen word right before an issue reference. Only madtea writes close lines, from its own `closes` list. Forge facts, from the Forgejo v15 and Gitea main source: - Close words: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved. Reopen words: reopen, reopens, reopened. - The forge matches `(?i)(?:\s|^|\(|\[)(WORD):? $` against the text just before each `#N` or `owner/repo#N`. - Close actions come only from a PR (title, body, comments) and from commits on the default branch. An issue body or an issue comment never closes anything. The ban covers those too, so the habit never forms. - A server can change the lists in app.ini (`CLOSE_KEYWORDS`, `REOPEN_KEYWORDS`), and no API shows them. madtea checks the 12 default words. A server with custom words is a known gap. Scope: every text a caller gives madtea, on the CLI and MCP: PR title and body, commit, merge and squash messages, issue bodies, comments, close reasons, and raw API writes to those endpoints. The refusal names the word and the reference, and points at `closes=`. This adds a new limit to the one write guard of docs/decisions/0046. It changes no recorded decision.
Author
Owner

Decided in docs/decisions/0058 (accepted). The implementation is tracked in #829.

Decided in docs/decisions/0058 (accepted). The implementation is tracked in #829.
Author
Owner

Decided in 0058-only-madtea-writes-close-words (accepted). The implementation is tracked in #829.

Decided in 0058-only-madtea-writes-close-words (accepted). The implementation is tracked in #829.
Sign in to join this conversation.
No milestone
No project
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
sixfold-space/madtea#817
No description provided.