Deleting a message that Slack no longer has counts as done, so the window
rewinds instead of staying stuck. A reset button clears the mark by hand,
and the empty-run notice now says since the last dispatch instead of seven
days.
The dispatch timestamp survived the deletion, so removing a message in Slack
left the digest permanently swallowed. Deleting now rewinds the window to the
newest digest that still stands.
chat.delete only removes what the bot posted itself, so webhook messages
answer cant_delete_message no matter how the id is found. Runs without a
stored id now say so instead of leading into a dead end.
conversations.history and chat.delete only take ids, so a stored name like
logbuch answered channel_not_found. The name is resolved through
conversations.list first, and the hint asks for the id.
The lookup swallowed Slack's error and the interface guessed at a cause.
It now shows the raw reason, widens the search window to six hours and
falls back to matching the message prefix.
A message sent through the webhook has no stored id, but it belongs to the
same Slack app, so the bot token may remove it. The delete button now looks
the message up in the channel by its text and time before deleting.
Incoming webhooks return no message id, so nothing can be removed later.
Settings now take a bot token plus channel, chat.postMessage records channel
and timestamp on the run, and the history carries a delete button per
message. The webhook stays as a fallback and is marked as not deletable.
New settings area: the webhook lives in the database and is only shown
shortened afterwards, the environment variable stays as a fallback. A switch
decides whether internal entries travel, a button sends the digest right
away, and every run is recorded with period, count, projects, result and
who triggered it.