For Odoo 18.0, for any Activity Type configured to Keep Done (keep activities marked as done in the activity view), an Automation like this:

with code like this:
for record in records:
channel = env['discuss.channel'].search([('id','=',5)])
if record.date_done and len(channel) == 1:
# what kind of document
doc = env['ir.model'].search([('model','=',record.res_model)]).name
# activity details
type = record.activity_type_id
summary = record.summary
note = record.note
# append summary and/or note
activity = type.name
if summary:
activity += f': {summary}'
if note:
activity += f'{note}'
# calculate on time or not
days = (datetime.date.today() - record.date_deadline).days
if days == 0:
when = 'on time'
if days < 0:
when = f'{abs(days)} days early'
if days > 0:
when = f'{days} days late'
if days == -1:
when = 'a day early'
if days == 1:
when = 'a day late'
# either (1) create a new activity or (2) send a message
# (1) define new activity
new_activity_vals = {
'res_model_id': record.res_model_id.id,
'res_id': record.res_id,
'activity_type_id': env.ref('mail.mail_activity_data_todo').id,
'summary': 'Review Completed Activity',
'user_id': record.create_uid.id,
}
# (1) create activity
env['mail.activity'].create(new_activity_vals)
# (2) define message
body = f'<b>{activity}</b> for {doc} <b><u>'
body += f'<a href="#" data-oe-model="{record.res_model}" '
body += f'data-oe-id="{record.res_id}">{env[record.res_model].search([('id','=',record.res_id)]).name}'
body += f'</a></u></b> completed {when}.'
# (2) post message
env['discuss.channel'].browse(5).message_post(body=body,
subtype_xmlid="mail.mt_comment",
body_is_html=True,message_type="auto_comment")
Here we assume the notification goes to a Discuss Channel with ID = 5 and we check if this channel still exists each time (assuming management will get stick of these after a while and delete the channel!)
Note: Your Odoo Digital Advisor or Odoo Partner can help you with this Automation if you don't have the technical skills - this is a prototype not a solution