From dcb40bb39b8a67ea7a2aaaacc5a5bcdadd0d2239 Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Fri, 22 May 2026 15:05:41 -0700 Subject: [PATCH 1/3] test replying in thread for chromatic and api diff --- .github/workflows/weekly-api-diff.yml | 44 +++++++++++++++----------- .github/workflows/weekly-chromatic.yml | 39 +++++++++++++---------- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/.github/workflows/weekly-api-diff.yml b/.github/workflows/weekly-api-diff.yml index 87e49e7c599..b0b6d59a188 100644 --- a/.github/workflows/weekly-api-diff.yml +++ b/.github/workflows/weekly-api-diff.yml @@ -148,7 +148,7 @@ jobs: raise SystemExit(f"Missing required environment variables: {', '.join(missing)}") today = os.environ['TODAY'] - channel = os.environ['SLACK_CHANNEL_ID'] + channel = os.environ.get('TEST_SLACK_ID') or os.environ['SLACK_CHANNEL_ID'] snapshots_repo = os.environ['SNAPSHOTS_REPO'] slack_token = os.environ['SLACK_TSDIFF_CHROMATIC_BOT_TOKEN'] github_token = os.environ['GITHUB_TOKEN'] @@ -165,13 +165,31 @@ jobs: new_release = os.environ.get('NEW_RELEASE') == 'true' + def post(text, thread_ts=None): + payload = {"channel": channel, "text": text, "unfurl_links": False, "unfurl_media": False} + if thread_ts: + payload["thread_ts"] = thread_ts + req = urllib.request.Request( + 'https://slack.com/api/chat.postMessage', + data=json.dumps(payload).encode(), + headers={ + 'Authorization': f'Bearer {slack_token}', + 'Content-Type': 'application/json' + } + ) + resp = json.loads(urllib.request.urlopen(req).read()) + print("Slack response:", resp.get('ok'), resp.get('error', '')) + if not resp.get('ok'): + raise SystemExit(f"Slack error: {resp.get('error')}") + return resp['message']['ts'] + if vs_release_size == 0: - message = f"šŸ“Š Weekly API Diff — {today}\n\nNo API changes detected vs last release — all pending changes have been included in a release." + body = "No API changes detected vs last release — all pending changes have been included in a release." elif vs_last_week_size == 0 and not new_release: prev_ref = f"last diff ({prev_date}): {prev_url}" if prev_date else "last diff" - message = f"šŸ“Š Weekly API Diff — {today}\n\nNo new API changes since {prev_ref}." + body = f"No new API changes since {prev_ref}." elif new_release: - message = f"šŸ“Š Weekly API Diff — {today}\n\nNew release since last diff — resetting baseline. Full diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." + body = f"New release since last diff — resetting baseline. Full diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." else: # Read the already-processed delta saved by the shell step delta_path = f"{workspace}/snapshots/deltas/{today}.txt" @@ -210,18 +228,8 @@ jobs: } ) summary = json.loads(urllib.request.urlopen(req).read())['choices'][0]['message']['content'] - message = f"šŸ“Š Weekly API Diff — {today}\n\n{summary}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." - - req = urllib.request.Request( - 'https://slack.com/api/chat.postMessage', - data=json.dumps({"channel": channel, "text": message}).encode(), - headers={ - 'Authorization': f'Bearer {slack_token}', - 'Content-Type': 'application/json' - } - ) - resp = json.loads(urllib.request.urlopen(req).read()) - print("Slack response:", resp.get('ok'), resp.get('error', '')) - if not resp.get('ok'): - raise SystemExit(f"Slack error: {resp.get('error')}") + body = f"{summary}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." + + ts = post(f"šŸ“Š Weekly API Diff — {today}") + post(f"šŸ“Š Weekly API Diff — {today}\n\n{body}", thread_ts=ts) PYEOF diff --git a/.github/workflows/weekly-chromatic.yml b/.github/workflows/weekly-chromatic.yml index dc1de4ac17c..e9e06f25d8f 100644 --- a/.github/workflows/weekly-chromatic.yml +++ b/.github/workflows/weekly-chromatic.yml @@ -66,6 +66,7 @@ jobs: env: SLACK_TSDIFF_CHROMATIC_BOT_TOKEN: ${{ secrets.SLACK_TSDIFF_CHROMATIC_BOT_TOKEN }} SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }} + TEST_SLACK_ID: ${{ secrets.TEST_SLACK_ID }} CHROMATIC_URL: ${{ needs.chromatic.outputs.build_url }} CHROMATIC_CODE: ${{ needs.chromatic.outputs.code }} CHROMATIC_FC_URL: ${{ needs.chromatic-fc.outputs.build_url }} @@ -83,7 +84,7 @@ jobs: raise SystemExit(f"Missing required environment variables: {', '.join(missing)}") today = date.today().isoformat() - channel = os.environ['SLACK_CHANNEL_ID'] + channel = os.environ.get('TEST_SLACK_ID') or os.environ['SLACK_CHANNEL_ID'] slack_token = os.environ['SLACK_TSDIFF_CHROMATIC_BOT_TOKEN'] def fmt(code, url): @@ -93,23 +94,29 @@ jobs: return f"āœ… | {url}" return f"āš ļø changes pending review | {url}" - message = "\n".join([ - f"šŸ“ø Weekly Chromatic — {today}", - "", + body = "\n".join([ f"Chromatic: {fmt(os.environ['CHROMATIC_CODE'], os.environ['CHROMATIC_URL'])}", f"Forced Colors: {fmt(os.environ['CHROMATIC_FC_CODE'], os.environ['CHROMATIC_FC_URL'])}", ]) - req = urllib.request.Request( - 'https://slack.com/api/chat.postMessage', - data=json.dumps({"channel": channel, "text": message}).encode(), - headers={ - 'Authorization': f'Bearer {slack_token}', - 'Content-Type': 'application/json' - } - ) - resp = json.loads(urllib.request.urlopen(req).read()) - print("Slack response:", resp.get('ok'), resp.get('error', '')) - if not resp.get('ok'): - raise SystemExit(f"Slack error: {resp.get('error')}") + def post(text, thread_ts=None): + payload = {"channel": channel, "text": text, "unfurl_links": False, "unfurl_media": False} + if thread_ts: + payload["thread_ts"] = thread_ts + req = urllib.request.Request( + 'https://slack.com/api/chat.postMessage', + data=json.dumps(payload).encode(), + headers={ + 'Authorization': f'Bearer {slack_token}', + 'Content-Type': 'application/json' + } + ) + resp = json.loads(urllib.request.urlopen(req).read()) + print("Slack response:", resp.get('ok'), resp.get('error', '')) + if not resp.get('ok'): + raise SystemExit(f"Slack error: {resp.get('error')}") + return resp['message']['ts'] + + ts = post(f"šŸ“ø Weekly Chromatic — {today}") + post(f"šŸ“ø Weekly Chromatic — {today}\n\n{body}", thread_ts=ts) PYEOF From 1d6445c01216ef6394af525131c78bd53c63ea1d Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Fri, 22 May 2026 15:30:45 -0700 Subject: [PATCH 2/3] verified chromatic works, try to fix tsdiff --- .github/workflows/weekly-api-diff.yml | 8 ++++++-- .github/workflows/weekly-chromatic.yml | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/weekly-api-diff.yml b/.github/workflows/weekly-api-diff.yml index b0b6d59a188..a7c93fc8eda 100644 --- a/.github/workflows/weekly-api-diff.yml +++ b/.github/workflows/weekly-api-diff.yml @@ -193,7 +193,10 @@ jobs: else: # Read the already-processed delta saved by the shell step delta_path = f"{workspace}/snapshots/deltas/{today}.txt" - model_input = open(delta_path).read() if os.path.exists(delta_path) else "" + model_input_full = open(delta_path).read() if os.path.exists(delta_path) else "" + TRUNCATE_LIMIT = 8000 + truncated = len(model_input_full) > TRUNCATE_LIMIT + model_input = model_input_full[:TRUNCATE_LIMIT] if truncated else model_input_full # Extract classification rules from prompt.md (single source of truth) prompt_md = open(f"{workspace}/scripts/weekly-api-diff/prompt.md").read() @@ -228,7 +231,8 @@ jobs: } ) summary = json.loads(urllib.request.urlopen(req).read())['choices'][0]['message']['content'] - body = f"{summary}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." + truncation_note = "\n\nāš ļø Delta was large — summary may be incomplete. Check the full delta link below." if truncated else "" + body = f"{summary}{truncation_note}\n\nWhat's new this week: {delta_url}\nFull diff vs release: {diff_url}\n\nReact āœ… if changes look expected, or 🚨 if something looks wrong." ts = post(f"šŸ“Š Weekly API Diff — {today}") post(f"šŸ“Š Weekly API Diff — {today}\n\n{body}", thread_ts=ts) diff --git a/.github/workflows/weekly-chromatic.yml b/.github/workflows/weekly-chromatic.yml index e9e06f25d8f..591475ef6fa 100644 --- a/.github/workflows/weekly-chromatic.yml +++ b/.github/workflows/weekly-chromatic.yml @@ -66,7 +66,6 @@ jobs: env: SLACK_TSDIFF_CHROMATIC_BOT_TOKEN: ${{ secrets.SLACK_TSDIFF_CHROMATIC_BOT_TOKEN }} SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }} - TEST_SLACK_ID: ${{ secrets.TEST_SLACK_ID }} CHROMATIC_URL: ${{ needs.chromatic.outputs.build_url }} CHROMATIC_CODE: ${{ needs.chromatic.outputs.code }} CHROMATIC_FC_URL: ${{ needs.chromatic-fc.outputs.build_url }} @@ -84,7 +83,7 @@ jobs: raise SystemExit(f"Missing required environment variables: {', '.join(missing)}") today = date.today().isoformat() - channel = os.environ.get('TEST_SLACK_ID') or os.environ['SLACK_CHANNEL_ID'] + channel = os.environ['SLACK_CHANNEL_ID'] slack_token = os.environ['SLACK_TSDIFF_CHROMATIC_BOT_TOKEN'] def fmt(code, url): From cdeeafaa0e6f4e6f8d5809d3ef541606b45109de Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Fri, 22 May 2026 15:38:58 -0700 Subject: [PATCH 3/3] finish testing --- .github/workflows/weekly-api-diff.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/weekly-api-diff.yml b/.github/workflows/weekly-api-diff.yml index a7c93fc8eda..1c49feb88d6 100644 --- a/.github/workflows/weekly-api-diff.yml +++ b/.github/workflows/weekly-api-diff.yml @@ -136,7 +136,6 @@ jobs: env: SLACK_TSDIFF_CHROMATIC_BOT_TOKEN: ${{ secrets.SLACK_TSDIFF_CHROMATIC_BOT_TOKEN }} SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }} - TEST_SLACK_ID: ${{ secrets.TEST_SLACK_ID }} GITHUB_TOKEN: ${{ github.token }} run: | python3 << 'PYEOF' @@ -148,7 +147,7 @@ jobs: raise SystemExit(f"Missing required environment variables: {', '.join(missing)}") today = os.environ['TODAY'] - channel = os.environ.get('TEST_SLACK_ID') or os.environ['SLACK_CHANNEL_ID'] + channel = os.environ['SLACK_CHANNEL_ID'] snapshots_repo = os.environ['SNAPSHOTS_REPO'] slack_token = os.environ['SLACK_TSDIFF_CHROMATIC_BOT_TOKEN'] github_token = os.environ['GITHUB_TOKEN']