Libra CodeHub

CedarCopilot/cedar-mail

Branch: staging

feat: per-merge customer deploy digest automation

merged#2858CedarCopilot

CedarCopilot wants to merge 0 commits into staging from cursor/daily-customer-deploy-digest-b524

Live on prod, watching, 1 day leftTimeline and evidence
  1. Opened
    Sep 21, 2026, 5:54 AM
  2. Merged
    Sep 21, 2026, 6:16 AM
  3. Live on prod
    Sep 21, 2026, 6:16 AM
  4. Observed 10 hours
    Sep 21, 2026, 6:16 AM
  5. Watching

    Live on prod, watching, 1 day left

    Sep 21, 2026, 6:16 AM
  6. Pipelines steady after this deploy
    Sep 21, 2026, 6:16 AM

Behaviors Libra is checking

When the merged PR title, body, or commit messages explicitly name customers, the automation posts a concise per-change Slack digest naming every relevant customer and linking back to the PR.Not checked
prod
The digest sender fails closed with a nonzero exit when digest content or webhook configuration is missing, or when Slack returns a non-success response.Not checked
prod
Operators can pass --dry-run to render the Slack-formatted digest locally without sending a webhook request.Not checked
prod
The digest sender accepts markdown from stdin or a file path and converts headings, bullets, checkboxes, links, bold text, and inline code into Slack mrkdwn before delivery.Not checked
prod
After each PR merge to main that deploys to production, the automation reviews only that merged PR and the commit messages it introduced.Not checked
prod
When a merged PR and its commit messages contain no explicit customer attribution, the automation skips posting to customer success and reports that the merge was reviewed and skipped.Not checked
prod

Libra has verdicts on 0 of 7 tracked behaviors on prod; 7 are still being checked. Libra checks hourly for 3 days after each deploy.

What

Adds an automation , a sibling of the changelog / product-updates automation , that runs once per PR merge to main (production) and tells the customer success team when the merged change is relevant to specific customers.

On each merge to main it:

  1. Reads the PR that just merged (via the triggering PR number / merge SHA) and its commit messages.
  2. Extracts every explicitly named customer from the PR title/body and commit messages.
  3. If the PR names one or more customers, posts a bulleted list to #customer-success , a plain-English description of the fix/feature, the customer(s) it's relevant for, and the PR link.
  4. If the PR names no customer, posts nothing (a per-merge "nothing here" line would flood the channel).

Why

The existing changelog automation is customer-facing and runs ~3×/week off the working branch. This one is internal (for CS), triggers per merge, reads the merged PR on main, and does not open a PR or write a changelog file , it just surfaces "what shipped for whom" so CS can proactively follow up with the customer whose bug/request just went live.

Changes

FileWhat
.cursor/skills/customer-deploy-digest/SKILL.mdThe per-merge automation prompt (scopes to the triggering PR , no time-window scan), customer-mention extraction rules (with explicit non-customer traps like model/vendor code-names , Jev, Sol, Kimi, Greptile , and teammates), message format, empty-state (skip silently by default), and per-merge triggering notes (including direct-push-to-main coverage).
scripts/send-customer-deploy-digest.tsWebhook sender that converts the digest markdown to Slack mrkdwn and posts to #customer-success via SLACK_CUSTOMER_SUCCESS_WEBHOOK_URL (falls back to SLACK_ALERTS_WEBHOOK_URL), mirroring scripts/send-slack-triage.ts. Supports -- --dry-run to preview. Unchanged from the initial revision.
package.jsonAdds the send-customer-deploy-digest script.

How to trigger

The per-merge trigger lives outside the repo (a Cursor Automation / Cloud Agent run, or a GitHub Action that launches one) and passes the run the merged PR number (and/or merge SHA). Point it at CedarCopilot/cedar-mail with the "Automation prompt (run on every merge to main)" block from the skill as its prompt. The environment needs gh (read access) and SLACK_CUSTOMER_SUCCESS_WEBHOOK_URL (or SLACK_ALERTS_WEBHOOK_URL).

Design decision

Empty-state defaults to silence on a merge that names no customer (posting the original "No customer fixes or feature requests found." line on every merge would flood #customer-success). That line is documented in the skill as an opt-in if per-merge confirmation is ever wanted.

Testing

Validated the sender rendering (unchanged) and the per-merge message format via --dry-run (nothing posted to Slack). Earlier validation ran the data-gathering commands against real production history and correctly surfaced Manufact while ignoring model/tooling names (Jev, Sol, Kimi) and teammate mentions.

Single-merge render (dry-run):

*Shipped to production , Vooma*

• Fixed Salesforce next-step sync dropping updates , *Vooma* (<https://github.com/CedarCopilot/cedar-mail/pull/2854|#2854>)
Open in Web 
Show production surfaces and changed-file mapping

Production surfaces

Libra has not measured any production surfaces for this change yet.

Changed files → surfaces

  • .cursor/skills/customer-deploy-digest/SKILL.mdno production surface mapped
  • package.jsonno production surface mapped
  • scripts/send-customer-deploy-digest.tsno production surface mapped