Low-severity residuals from the #3696 review, batched:
announcementFor (slack-app/listeners/actions/proposal-button.js) checks the resource URL before kind, so a future cancel-kind op that also returns a resource would announce "Approved — follow it here" instead of "Cancelled". Latent today (cancel has no resource builder).
proposal-builder.js caps the server-sent button label with .slice(0, 75) on UTF-16 units; an emoji at the boundary yields an unpaired surrogate that can make Slack reject the whole message. The file's own capChars is code-point-safe.
- The frozen base prompt's spend enumeration ("running a suite or a case, generating cases, cancelling a run") predates the two new gated ops. Fixing it is a deliberate cache-invalidating edit to the snapshot-pinned literal.
🤖 Generated with Claude Code
Low-severity residuals from the #3696 review, batched:
announcementFor(slack-app/listeners/actions/proposal-button.js) checks the resource URL beforekind, so a future cancel-kind op that also returns a resource would announce "Approved — follow it here" instead of "Cancelled". Latent today (cancel has no resource builder).proposal-builder.jscaps the server-sent button label with.slice(0, 75)on UTF-16 units; an emoji at the boundary yields an unpaired surrogate that can make Slack reject the whole message. The file's owncapCharsis code-point-safe.🤖 Generated with Claude Code