- Shipped
- September 6, 2026 at 7:19 PM UTC
- Author
- Kamo
- Commit
- 765aa29
`SystemBugThread` renders everything anybody has said about a report and every status it has passed through, under the current-status callout: the callout answers "why is it here now", which is what most readers came for, and the transcript answers "how did it get here", which is what the fourth attempt at a fix needs. It reads **************** and not the media session endpoints every other transcript in the console uses. Those authorize by session membership; a bug thread is readable by everybody the REPORT is visible to, which is a far wider set than the people who have posted on it. One dialog now collects the comment for all three statuses that carry one. They differ in the wording and in whether the field may be left empty, and both are read off the status — so shelving and Issue Persists refuse a blank and a denial still does not. The heading follows suit: a denial explains a decision, a shelving explains a delay, and a failed fix reports what is still broken, and heading all three "Reason for denial" made the last one read as an apology. Issue Persists is its own button beside Fix Verified and its own endpoint, drawn from `canReportIssuePersists` — the server's answer, never derived. Its audience is wider than Fix Verified's and its departure statuses are different, so a client inferring it from `canManage` or from ownership would hide it from exactly the colleague it exists for. It is disabled in the triage dropdown for the same reason: reopening a report there would skip the reason the status exists to carry. `SystemBugDrawerTriage` gained a scoping fix worth naming — the thread's composer is a textarea on the same page and comes first in document order, and `[role="dialog"]` does not tell the two apart because the drawer carries that role too. An unscoped lookup typed the denial reason into the comment box and sent the denial out blank.