Nightly Slack notification: perf+eval canvas with peak / 7d-avg±σ / current tables - #13
Open
khluu wants to merge 1 commit into
Open
Nightly Slack notification: perf+eval canvas with peak / 7d-avg±σ / current tables#13khluu wants to merge 1 commit into
khluu wants to merge 1 commit into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Member
Author
|
✅ Live end-to-end test passed against the production
Ran the committed lib code path ( Prod checklist: set Vercel |
…current tables Replace the nightly perf/eval Slack notification with a Slack Canvas (real tables) plus a short summary message linking to it, posted to #ci-notifications by the existing nightly cron (vercel.json `0 16 * * *`). Each run compares, per perf config and per eval metric: - Peak (best over the trailing 30 days) - 7-day moving average ±σ - Current nightly value - Δ vs avg and Δ vs peak (relative %) - a 🔴/🟢 status dot (🔴 = regression vs the 7-day average: ≥2σ and ≥1%) - compare.ts: computePerfHistory() / computeEvalHistory() over a nightly window (current, peak, 7d mean ±σ, z, status, deltaPct, deltaPeakPct). Existing exports untouched (still used by /api/nightly, /compare, /perf). - nightly-template.ts: renderNightlyCanvas() (Canvas-flavored Markdown tables) and renderChannelSummary() (feed message). Legacy text-table format removed. - slack.ts: createCanvas() / shareCanvasToChannel() (canvases.create / canvases.access.set). - cron route: build history -> create canvas -> share to channel -> post the linking message; degraded link-less message fallback if canvas creation fails. Verified end-to-end against live data and a live post to #ci-notifications via the vllm_ci_bot token (canvas create + channel share + message all succeed). Requires the bot's canvases:write scope and SLACK_CI_NOTIFICATIONS_CHANNEL set. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: khluu <khluu000@gmail.com>
khluu
force-pushed
the
refactor/nightly-summary-template
branch
from
June 7, 2026 08:49
0198a0d to
8ca7739
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Reworks the nightly perf/eval Slack notification from a plain text message into a Slack Canvas (real tables) plus a short summary message in
#ci-notificationsthat links to it.Each nightly run now compares, per model/config (perf) and per model/task/metric (eval):
The feed message carries the headline counts + any flagged rows and links to the full canvas.
Why
Slack messages can't render real tables, so the previous code-block layout was cramped and hard to scan. A canvas gives proper tables; the summary message keeps at-a-glance regression visibility in the channel feed.
Changes
compare.ts—computeEvalHistory()(mirrorscomputePerfHistory()): per (model, task, n_shot, metric, filter) current / peak / trailing 7d mean ±σ / z / status. AddeddeltaPeakPctto both perf and eval history rows. Existing exports untouched (still used by/api/nightly,/compare,/perf).nightly-template.ts—renderNightlyCanvas()(Canvas-flavored Markdown: perf + eval tables with the status dot and Δ-vs-avg / Δ-vs-peak columns) andrenderChannelSummary()(feed message).renderNightlySummary()retained as a fallback.slack.ts—createCanvas()andshareCanvasToChannel()(canvases.create/canvases.access.set).cron/nightly-summaryroute — loads the nightly window, computes perf + eval history, creates a canvas, shares it toSLACK_CI_NOTIFICATIONS_CHANNEL, and posts the linking message. Falls back to the text-table message if the canvas call fails, so notifications never silently break.Testing
tsc --noEmit,eslint, andnext buildall pass.canvases:writescope to therunner_queue_alertSlack app and reinstall it to the workspace. The bot currently has onlyincoming-webhook, chat:write, reactions:write; until the scope is added the cron uses the text-message fallback (no breakage).SLACK_CI_NOTIFICATIONS_CHANNELpoints to#ci-notifications.Note:
canvases.create's request shape is confirmed (a scope-less probe failed only onmissing_scope, not arguments), butcanvases.access.set(the channel-share call) is unverified until the bot has the scope — will confirm with a live run and adjust the field format if Slack requires it.🤖 Generated with Claude Code