Commit 9ec5c99
fix(interactions): refuse to resolve a card whose issue is already closed
`queueResolvedInteractionContinuationWakeup` drops the continuation wakeup
when the issue is `done`/`cancelled`. The `accept`, `reject`, `respond` and
`verdicts` routes never looked at the issue status, so a resolution there ran
all the way through: the card flipped to `accepted`/`rejected`/`answered`,
`logActivity` recorded it, the route answered 200 — and nobody was woken. The
card reads as answerable in the UI, someone answers it in good faith, and
nothing happens. No error, no hint.
Closing an issue expires its pending cards (#10251), so in the normal case
the `status !== "pending"` check already refuses these. What it does not cover
is the residue: rows that were filed before that expiry shipped are still
`pending` on issues that closed months ago. On the instance this was found on,
154 such cards sit on 145 closed issues, 146 of them carrying
`continuationPolicy: wake_assignee` — every one of them a trap that looks
answerable and is not. Three of them ask the reader in their prompt to reply.
So the guard is a second line rather than the first: it reads the issue status
after the pending check and answers 409 with the closed status in the error
details, which is the honest outcome for an answer that cannot travel. An
already-resolved card still reports "Interaction has already been resolved" —
that message is more specific, and the ordering keeps this change to the one
case that is currently silent.
`withdraw` and `cancel` are deliberately left alone. Retiring a stale card on a
closed issue is exactly the cleanup those routes exist for, and blocking them
would strand the residue this guard makes visible.
The status is read from the database inside the resolution path rather than
taken from the caller's issue object, so the plugin host's accept/reject path
is covered by the same check and not just the HTTP routes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent 4eace88 commit 9ec5c99
3 files changed
Lines changed: 174 additions & 13 deletions
File tree
- server/src/services
- skills/paperclip/references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
| 18 | + | |
| 19 | + | |
24 | 20 | | |
25 | 21 | | |
26 | 22 | | |
27 | 23 | | |
28 | 24 | | |
29 | 25 | | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
30 | 34 | | |
31 | 35 | | |
32 | 36 | | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
33 | 43 | | |
34 | 44 | | |
35 | 45 | | |
| |||
38 | 48 | | |
39 | 49 | | |
40 | 50 | | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
45 | 60 | | |
46 | 61 | | |
47 | 62 | | |
| |||
327 | 342 | | |
328 | 343 | | |
329 | 344 | | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
330 | 453 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
| 81 | + | |
81 | 82 | | |
82 | 83 | | |
83 | 84 | | |
| |||
240 | 241 | | |
241 | 242 | | |
242 | 243 | | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
243 | 278 | | |
244 | 279 | | |
245 | 280 | | |
| |||
1028 | 1063 | | |
1029 | 1064 | | |
1030 | 1065 | | |
| 1066 | + | |
1031 | 1067 | | |
1032 | 1068 | | |
1033 | 1069 | | |
| |||
1591 | 1627 | | |
1592 | 1628 | | |
1593 | 1629 | | |
| 1630 | + | |
1594 | 1631 | | |
1595 | 1632 | | |
1596 | 1633 | | |
| |||
2129 | 2166 | | |
2130 | 2167 | | |
2131 | 2168 | | |
| 2169 | + | |
2132 | 2170 | | |
2133 | 2171 | | |
2134 | 2172 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
975 | 975 | | |
976 | 976 | | |
977 | 977 | | |
978 | | - | |
| 978 | + | |
979 | 979 | | |
980 | 980 | | |
981 | 981 | | |
| |||
0 commit comments