Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
cc97b0c
Bump API schema to 2b03abf7 (#20101)
sentry-api-schema-updater[bot] Oct 20, 2026
1a09849
docs(self-hosted): remove invalid mentions of copying .env.custom and…
aldy505 Oct 20, 2026
a01d830
Bump API schema to 1ef2ab27 (#20104)
sentry-api-schema-updater[bot] Oct 20, 2026
a706b45
Bump API schema to a1e7464c (#20105)
sentry-api-schema-updater[bot] Oct 20, 2026
d2d61f0
docs(size-analysis): Link status check rules API from Status Checks (…
sentry-junior[bot] Oct 20, 2026
2c1980a
docs(develop): Remove next_trace span link type (#20113)
sentry-junior[bot] Oct 20, 2026
24bf5ea
Bump API schema to 3cdad034 (#20114)
sentry-api-schema-updater[bot] Oct 20, 2026
ae06929
Bump API schema to a25931d5 (#20115)
sentry-api-schema-updater[bot] Oct 20, 2026
6f86cef
docs(nestjs): Clarify background job scope isolation (#20079)
nicohrubec Oct 20, 2026
77086df
docs: Remove outdated logs and metrics enable flags from shared pages…
dingsdax Oct 20, 2026
29e6c68
docs(auth): Add SCIM 2.0 service discovery section (#19817)
saadk408 Oct 20, 2026
c9cb8e7
Bump API schema to f56baf12 (#20118)
sentry-api-schema-updater[bot] Oct 21, 2026
24f553d
Bump API schema to 285d9cbc (#20119)
sentry-api-schema-updater[bot] Oct 21, 2026
dca8c33
docs(python): Fix trace_ignore_status_codes option type (#20121)
sentry-junior[bot] Oct 21, 2026
84d5e59
docs(js): Load the Deno import hook with --preload (#20080)
JPeer264 Oct 21, 2026
8654e16
feat(docs): Apply new quick start template to .NET quick start guides…
sentry-junior[bot] Oct 21, 2026
f1d092b
getsentry/relay@60972d455a1178423ec2d793a2d783158c022896
untitaker Oct 21, 2026
e64c3ea
docs(php): Fix before_breadcrumb return type (#20122)
sentry-junior[bot] Oct 21, 2026
2bd643f
docs(python): Add `data_collection` alternatives to integration docs …
sentrivana Oct 21, 2026
c1e408b
docs(python): Use `data_collection` in `init` snippets (#20130)
sentrivana Oct 21, 2026
d8a2c92
docs(python): Clarify that manual AI span attributes aren't filtered …
sentrivana Oct 21, 2026
636057c
Bump API schema to dc40ad2b (#20133)
sentry-api-schema-updater[bot] Oct 21, 2026
46929c9
Bump API schema to f5e2db97 (#20134)
sentry-api-schema-updater[bot] Oct 21, 2026
73db022
Bump API schema to 2c407fef (#20135)
sentry-api-schema-updater[bot] Oct 21, 2026
6207372
Bump API schema to 03b63c05 (#20136)
sentry-api-schema-updater[bot] Oct 21, 2026
4d01b27
Bump API schema to 8de28f6d (#20138)
sentry-api-schema-updater[bot] Oct 21, 2026
b7fb950
Bump API schema to ceaace46 (#20139)
sentry-api-schema-updater[bot] Oct 21, 2026
bf18dfc
Bump API schema to e2dc40b3 (#20140)
sentry-api-schema-updater[bot] Oct 21, 2026
faf8b61
Bump API schema to 90906f96 (#20141)
sentry-api-schema-updater[bot] Oct 21, 2026
a414879
feat(Explore): New Dropped Data page, new Explore feature page, updat…
sfanahata Oct 21, 2026
fe396af
Bump API schema to e8dba7a5 (#20144)
sentry-api-schema-updater[bot] Oct 21, 2026
39f102d
Bump API schema to f3f06b3a (#20145)
sentry-api-schema-updater[bot] Oct 21, 2026
1bac950
Bump API schema to 9697fe8e (#20146)
sentry-api-schema-updater[bot] Oct 21, 2026
3c5e7cc
Bump API schema to 4331a7d3 (#20147)
sentry-api-schema-updater[bot] Oct 21, 2026
d17048d
Bump API schema to 82d40817 (#20148)
sentry-api-schema-updater[bot] Oct 21, 2026
1c5b4c9
Bump API schema to 35fcbf58 (#20149)
sentry-api-schema-updater[bot] Oct 21, 2026
14991c7
docs(integrations): Consolidate code mappings onto one page (#20037)
coolguyzone Oct 21, 2026
0d03193
feat(docs): Apply new quick start template to JavaScript quick start …
sentry-junior[bot] Oct 21, 2026
9728d2b
chore(codeowners): Use combined @getsentry/replay team (#20117)
sentry-junior[bot] Oct 21, 2026
9eb3e5c
Bump API schema to 277e2b11 (#20152)
sentry-api-schema-updater[bot] Oct 21, 2026
a91908f
Bump API schema to 65ff00aa (#20153)
sentry-api-schema-updater[bot] Oct 21, 2026
330727b
Bump API schema to c7d6eef6 (#20154)
sentry-api-schema-updater[bot] Oct 21, 2026
5aa8244
Bump API schema to 56b2ed5c (#20155)
sentry-api-schema-updater[bot] Oct 21, 2026
a3acb51
Bump API schema to 51baedb1 (#20156)
sentry-api-schema-updater[bot] Oct 21, 2026
b9d1913
Bump API schema to e3ee5395 (#20157)
sentry-api-schema-updater[bot] Oct 21, 2026
92406c9
build(node): Bump Node to 22.23.4 (#20150)
sentry-junior[bot] Oct 21, 2026
67a59cd
docs(uptime): Document redirect limit for uptime checks (#20160)
sentry-junior[bot] Oct 21, 2026
269bae7
Bump API schema to f45d69fe (#20164)
sentry-api-schema-updater[bot] Oct 22, 2026
5af5ec2
Bump API schema to 79c193f9 (#20165)
sentry-api-schema-updater[bot] Oct 22, 2026
57dd396
docs(crons): Add arq setup for Python (#20056)
wedamija Oct 22, 2026
20fd09e
Bump API schema to 8f61c4a4 (#20166)
sentry-api-schema-updater[bot] Oct 22, 2026
cf9a67c
Bump API schema to c4a364de (#20167)
sentry-api-schema-updater[bot] Oct 22, 2026
7beb293
docs(crons): Add Huey setup for Python (#20057)
wedamija Oct 22, 2026
92ea675
Bump API schema to 2da92393 (#20168)
sentry-api-schema-updater[bot] Oct 22, 2026
3a864da
Bump API schema to 6bb07ed1 (#20169)
sentry-api-schema-updater[bot] Oct 22, 2026
24fdeaa
docs(crons): Add RQ setup for Python (#20058)
wedamija Oct 22, 2026
ddb6cbb
docs(span-links): Add `message_origin` link type for queues (#20023)
JPeer264 Oct 22, 2026
78378e5
docs(react-native): Document sentryWebViewProps for connecting WebVie…
antonis Oct 22, 2026
3d07604
Bump API schema to 42234aff (#20173)
sentry-api-schema-updater[bot] Oct 22, 2026
7df88c0
Bump API schema to da794a6f (#20174)
sentry-api-schema-updater[bot] Oct 22, 2026
9865bc4
Bump API schema to 4973d6c8 (#20175)
sentry-api-schema-updater[bot] Oct 22, 2026
d7c8715
Bump API schema to 81f843cd (#20176)
sentry-api-schema-updater[bot] Oct 22, 2026
cdaff3a
Bump API schema to 969b8a53 (#20177)
sentry-api-schema-updater[bot] Oct 22, 2026
1cb3e48
Bump API schema to 3a22f564 (#20178)
sentry-api-schema-updater[bot] Oct 22, 2026
723b4a4
getsentry/relay@2426e71153953a9b7cf01e0bfebe3a9072c1c96e
untitaker Oct 22, 2026
145be49
Bump API schema to cb84288a (#20179)
sentry-api-schema-updater[bot] Oct 22, 2026
00b561c
docs(organization): Add steps for switching SaaS data storage locatio…
sentry-junior[bot] Oct 22, 2026
b14b568
docs(get-started): Remove duplicate resource sections (#20158)
sentry-junior[bot] Oct 22, 2026
fdf3c08
Bump API schema to 969e159e (#20181)
sentry-api-schema-updater[bot] Oct 22, 2026
19ca335
Bump API schema to c775f862 (#20182)
sentry-api-schema-updater[bot] Oct 22, 2026
c05fd10
Bump API schema to f8158928 (#20183)
sentry-api-schema-updater[bot] Oct 22, 2026
28742a6
Bump API schema to 786d404c (#20184)
sentry-api-schema-updater[bot] Oct 22, 2026
7138fcf
Bump API schema to e07d44d7 (#20185)
sentry-api-schema-updater[bot] Oct 22, 2026
4d259b8
Bump API schema to ae87efef (#20186)
sentry-api-schema-updater[bot] Oct 22, 2026
ba85fc7
Bump API schema to 1f67a23b (#20187)
sentry-api-schema-updater[bot] Oct 22, 2026
03beb4f
Bump API schema to fa042997 (#20188)
sentry-api-schema-updater[bot] Oct 22, 2026
73e4919
docs(crons): Clarify that schedules under one minute aren't supported…
sentry-junior[bot] Oct 22, 2026
8754bb0
Bump API schema to 67fda936 (#20189)
sentry-api-schema-updater[bot] Oct 22, 2026
c96230f
Bump API schema to a1b331b4 (#20190)
sentry-api-schema-updater[bot] Oct 22, 2026
7471f43
Bump API schema to c2a832ce (#20191)
sentry-api-schema-updater[bot] Oct 22, 2026
8c060f8
Bump API schema to e12fef99 (#20192)
sentry-api-schema-updater[bot] Oct 22, 2026
effac90
feat(sidebar): Add Overview link to sections with a hidden landing pa…
sentry-junior[bot] Oct 22, 2026
2544038
Bump API schema to 789d8d03 (#20194)
sentry-api-schema-updater[bot] Oct 22, 2026
aae0c28
Bump API schema to 33b89d82 (#20195)
sentry-api-schema-updater[bot] Oct 22, 2026
374e982
docs(agents): Add Claude Platform OTLP guide and Anthropic home card …
sentry-junior[bot] Oct 22, 2026
9e0a80a
feat(develop): Adjust DSC spec to be compatible with span streaming (…
Lms24 Oct 23, 2026
870a461
Bump API schema to c94cc7c6 (#20197)
sentry-api-schema-updater[bot] Oct 23, 2026
9ba213e
Bump API schema to d9310258 (#20198)
sentry-api-schema-updater[bot] Oct 23, 2026
71c7160
Bump API schema to 3675f898 (#20201)
sentry-api-schema-updater[bot] Oct 23, 2026
0a05bbc
Bump API schema to c6769d68 (#20202)
sentry-api-schema-updater[bot] Oct 23, 2026
4e878c4
docs(js): Clarify where the Next.js instrumentation file goes (#20125)
s1gr1d Oct 23, 2026
2591ec2
docs(js): Stop adding default AI integrations in setup snippets (#20200)
sentry-junior[bot] Oct 23, 2026
aa30f1d
Bump API schema to 2def58c9 (#20203)
sentry-api-schema-updater[bot] Oct 23, 2026
d3301f3
Bump API schema to 4e68e377 (#20204)
sentry-api-schema-updater[bot] Oct 23, 2026
4641e18
Bump API schema to 9bffb4bf (#20205)
sentry-api-schema-updater[bot] Oct 23, 2026
301e6f7
Bump API schema to 1a275ec7 (#20206)
sentry-api-schema-updater[bot] Oct 23, 2026
16e04b3
docs(product): Update stale images on Suspect Commits page (#19994)
inventarSarah Oct 23, 2026
6ad4c6a
Bump API schema to b2442fb4 (#20207)
sentry-api-schema-updater[bot] Oct 23, 2026
e251517
Bump API schema to 3a52c312 (#20208)
sentry-api-schema-updater[bot] Oct 23, 2026
07730ce
Bump API schema to d0e86507 (#20210)
sentry-api-schema-updater[bot] Oct 23, 2026
d35fc11
Bump API schema to d7cdfb43 (#20211)
sentry-api-schema-updater[bot] Oct 23, 2026
ae20156
bug(data retention): Updating account data retention (#20196)
sfanahata Oct 23, 2026
bd0bfa6
Bump API schema to 285756dc (#20212)
sentry-api-schema-updater[bot] Oct 23, 2026
111049f
Bump API schema to 5c2854c5 (#20213)
sentry-api-schema-updater[bot] Oct 23, 2026
9d363eb
Bump API schema to ca9a742d (#20215)
sentry-api-schema-updater[bot] Oct 23, 2026
f44900d
Bump API schema to 6d0a2152 (#20216)
sentry-api-schema-updater[bot] Oct 23, 2026
145f986
Bump API schema to 0430d19e (#20219)
sentry-api-schema-updater[bot] Oct 23, 2026
b771435
Bump API schema to 33b92f28 (#20220)
sentry-api-schema-updater[bot] Oct 23, 2026
bc06b25
Bump API schema to 7b9f8d9b (#20221)
sentry-api-schema-updater[bot] Oct 23, 2026
b64456f
Bump API schema to 3bfc6ce3 (#20222)
sentry-api-schema-updater[bot] Oct 23, 2026
d6e19be
Bump API schema to 45d2f893 (#20223)
sentry-api-schema-updater[bot] Oct 23, 2026
d926960
Bump API schema to 1b81cbc7 (#20224)
sentry-api-schema-updater[bot] Oct 23, 2026
91b8dcf
Bump API schema to 1aaa7af8 (#20230)
sentry-api-schema-updater[bot] Oct 26, 2026
afab021
Bump API schema to 06f4a0f2 (#20231)
sentry-api-schema-updater[bot] Oct 26, 2026
c56f385
feat(llms): Updated llms instructions (#20116)
sfanahata Oct 26, 2026
c90a74f
Bump API schema to 46e6baad (#20232)
sentry-api-schema-updater[bot] Oct 26, 2026
6388344
Bump API schema to b5335bf4 (#20233)
sentry-api-schema-updater[bot] Oct 26, 2026
cf82b21
feat(middleware): Serve production build URLs to the evals pin header…
jaydgoss Oct 26, 2026
b325a6f
ci(evals): Run the AI evals on a labeled PR's docs preview (#20214)
jaydgoss Oct 26, 2026
f843ca1
Bump API schema to 0c5dd3da (#20238)
sentry-api-schema-updater[bot] Oct 26, 2026
33a8783
Bump API schema to 09f6633f (#20239)
sentry-api-schema-updater[bot] Oct 26, 2026
f1e25b1
feat(docs): Apply new quick start template to Godot quick start guide…
sentry-junior[bot] Oct 26, 2026
7c6bb55
Bump API schema to 28cded78 (#20241)
sentry-api-schema-updater[bot] Oct 26, 2026
aa7e26d
fix(ai): Replace dead agent skill links (#20123)
dingsdax Oct 26, 2026
571b0b2
fix(platform-redirect): Keep the anchor when no platform is selected …
coolguyzone Oct 26, 2026
764affd
Bump API schema to 916a2cd6 (#20242)
sentry-api-schema-updater[bot] Oct 26, 2026
c643b50
docs(python): Correct max_request_body_size small and medium cutoffs …
sentry-junior[bot] Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@

# ###### Replays #######

# /docs/product/explore/session-replay/web @getsentry/replay-sdk-web @getsentry/replay-frontend @getsentry/replay-backend
# /docs/product/explore/session-replay/mobile @getsentry/replay-sdk-mobile @getsentry/replay-frontend @getsentry/replay-sdk-mobile
# /docs/product/explore/session-replay/web @getsentry/replay-sdk-web @getsentry/replay
# /docs/product/explore/session-replay/mobile @getsentry/replay-sdk-mobile @getsentry/replay @getsentry/replay-sdk-mobile
# /includes/session-replay-web-report-bug.mdx @getsentry/replay-sdk-web
# /platform-includes/session-replay/ @getsentry/replay-sdk-web @getsentry/replay-sdk-mobile
# /docs/platforms/javascript/common/session-replay/ @getsentry/replay-sdk-web
Expand Down
9 changes: 9 additions & 0 deletions .github/labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,11 @@
color: 0E8A16
description: Prevents automatic closure of stale PRs

# AI evals - .github/workflows/ai-evals.yml
- name: 'ai-evals:llms_txt:sonnet-5.5:x3'
color: 6F42C1
description: Run the llms.txt eval 3 times on Sonnet 5.5, on this PR's preview and its merge base's docs

# Miscellaneous
- name: API Docs
color: 649B42
Expand All @@ -304,6 +309,8 @@
color: '584774'
- name: gatsby-bug
color: e99695
- name: Good First Issue
color: 4cb782
- name: "Hacktoberfest \U0001F383"
color: ffa500
- name: Hacktoberfest-accepted
Expand All @@ -316,6 +323,8 @@
- name: javascript
color: F6F6F8
description: Pull requests that update Javascript code
- name: js-v11-docs
color: '206131'
- name: Mobile
color: f2c94c
- name: performance
Expand Down
257 changes: 257 additions & 0 deletions .github/workflows/ai-evals.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,257 @@
# Runs the getsentry/sentry-for-ai-evals suites against this PR's docs.
#
# Label a PR `ai-evals:<mark>` to run the tests with that pytest mark on each target (a
# harness with a model) that repo's plan-evals action lists, or `ai-evals:<mark>:<models>`
# to run them on the targets whose `<harness>:<model>` contains `<models>`, and a last
# `:x<count>` runs each test that many times, e.g. `ai-evals:llms_txt:sonnet-5.5:x3` for
# three runs on Sonnet 5.5 of the test that starts from llms.txt with no Sentry skills or
# MCP, only the docs. The labels are in .github/labels.yml, since sync-labels.yml deletes
# any label that isn't. Each label runs with two sets of docs and the same skills, from
# sentry-for-ai's `main`: the head reads docs.sentry.io from the PR's Vercel preview and
# the base from the production deploy of the PR's merge base. The plan job creates one run
# per label and side on evals.sentry.dev, and a job per test, target and side sends that
# test's result into it, each test in a clean container and all of them at once. A new
# push reruns every eval label still on the PR.
#
# A production deploy redirects every page to docs.sentry.io unless the request has the
# x-sentry-evals-pin header that the evals' docs proxy sends (middleware.ts). Deploys built
# before middleware.ts checked for it redirect anyway, so a merge base like that, or one
# with no production deploy, gets the live docs as the base, which is master as it is when
# the runs start. A head that's behind master is then missing what master gained since, and
# the comparison counts that as the PR's. The plan job warns then, and updating the branch,
# which reruns the evals, makes the comparison show only the PR. sentry-evals[bot] comments
# on the PR with the runs.
#
# sentry-for-ai-evals is internal, so the jobs check it out with the readonly bot's token
# and use its actions from that path. Fork PRs get no secrets, so they're skipped. This
# repo is public, so the eval outputs aren't kept as artifacts; the results go to
# evals.sentry.dev.

name: AI Evals

on:
pull_request:
types: [labeled, synchronize]

permissions: {}

jobs:
plan:
if: >-
github.event.pull_request.head.repo.full_name == github.repository && (
(github.event.action == 'labeled' && startsWith(github.event.label.name, 'ai-evals:')) ||
(github.event.action == 'synchronize' && contains(join(github.event.pull_request.labels.*.name, ','), 'ai-evals:'))
)
runs-on: ubuntu-latest
# Mostly waiting for the preview, which is ready about 7 minutes after a push.
timeout-minutes: 30
permissions:
contents: read
deployments: read
pull-requests: read
statuses: read
outputs:
evals-sha: ${{ steps.evals.outputs.commit }}
skills-sha: ${{ steps.skills.outputs.sha }}
docs-url: ${{ steps.preview.outputs.url }}
base-docs-url: ${{ steps.base.outputs.url }}
base-sha: ${{ steps.base.outputs.sha }}
eval-runs: ${{ steps.create.outputs.runs }}
eval-jobs: ${{ steps.create.outputs.jobs }}
steps:
- name: Get sentry-for-ai-evals token
id: token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.SENTRY_READONLY_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_READONLYBOT_PRIVATE_KEY }}
repositories: sentry-for-ai-evals
permission-contents: read

- id: evals
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: getsentry/sentry-for-ai-evals
token: ${{ steps.token.outputs.token }}
path: sentry-for-ai-evals
persist-credentials: false

- id: plan
uses: ./sentry-for-ai-evals/.github/actions/plan-evals

# Both sides build the skills from the same commit, so only the docs differ.
- id: skills
run: |
ref="$(git ls-remote --exit-code https://github.com/getsentry/sentry-for-ai refs/heads/main)"
echo "sha=${ref%%$'\t'*}" >> "$GITHUB_OUTPUT"

# vercel[bot] sets the commit status while the preview builds and creates the
# deployment, whose status has the URL, once it's done. This waits before the runs
# are created, since evals.sentry.dev fails a run that gets no result for 30 minutes.
- name: Wait for the Vercel preview
id: preview
if: steps.plan.outputs.count != '0'
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
context="Vercel – sentry-docs"
environment="Preview – sentry-docs"
for (( i = 0; i < 40; i++ )); do
(( i == 0 )) || sleep 30
# A newer push has a run of its own, so this one stops without creating runs.
current="$(gh api "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER" --jq .head.sha)" || continue
if [[ "$current" != "$HEAD_SHA" ]]; then
echo "::notice::The PR's head is now $current, which its own run evaluates"
exit 0
fi
statuses="$(gh api "repos/$GITHUB_REPOSITORY/commits/$HEAD_SHA/status")" || continue
IFS=$'\t' read -r state description < <(jq -r --arg c "$context" \
'.statuses[] | select(.context == $c) | [.state, .description] | @tsv' <<<"$statuses") || true
case "$state" in
failure | error)
echo "::error::The sentry-docs preview of $HEAD_SHA failed: $description"
exit 1
;;
success)
ids="$(gh api -X GET "repos/$GITHUB_REPOSITORY/deployments" \
-f sha="$HEAD_SHA" -f environment="$environment" --jq '.[].id')" || continue
url=""
for id in $ids; do
url="$(gh api "repos/$GITHUB_REPOSITORY/deployments/$id/statuses" \
--jq 'map(select(.state == "success"))[0].environment_url // empty')" || continue
[[ -n "$url" ]] && break
done
if [[ -n "$url" ]]; then
# The agent reads the .md exports, without a bypass token.
if ! curl -fsS -o /dev/null "$url/index.md"; then
echo "::error::The preview at $url doesn't serve index.md, so the agent couldn't read docs from it"
exit 1
fi
echo "Preview: $url"
echo "url=$url" >> "$GITHUB_OUTPUT"
exit 0
fi
# A PR that only changes develop-docs doesn't build sentry-docs.
if [[ "$description" == *"Ignored Build Step"* ]]; then
echo "::error::Vercel didn't build a sentry-docs preview of $HEAD_SHA ($description). A PR that only changes develop-docs has no sentry-docs preview to evaluate."
exit 1
fi
;;
esac
done
echo "::error::No sentry-docs preview of $HEAD_SHA after 20 minutes"
exit 1

# The merge base's production deploy, if it serves its own pages to the pin header.
# curl doesn't follow redirects, so a deploy that redirects anyway isn't a 200. Else
# the live docs, right before the runs start so they're the ones the runs read, and
# behind_by counts the base branch's commits the head is missing.
- id: base
if: steps.preview.outputs.url != ''
env:
GH_TOKEN: ${{ github.token }}
# The branch, not base.sha, which is a snapshot from the event and can lag it.
BASE_REF: ${{ github.event.pull_request.base.ref }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
compare="$(gh api "repos/$GITHUB_REPOSITORY/compare/$BASE_REF...$HEAD_SHA?per_page=1" \
--jq '"\(.merge_base_commit.sha) \(.base_commit.sha) \(.behind_by)"')"
read -r merge_base base_tip behind <<<"$compare"
ids="$(gh api -X GET "repos/$GITHUB_REPOSITORY/deployments" \
-f sha="$merge_base" -f environment="Production – sentry-docs" --jq '.[].id')" || ids=""
url=""
for id in $ids; do
url="$(gh api "repos/$GITHUB_REPOSITORY/deployments/$id/statuses" \
--jq 'map(select(.state == "success"))[0].environment_url // empty')" || continue
[[ -n "$url" ]] && break
done
if [[ -n "$url" ]] && [[ "$(curl -sS -o /dev/null -w '%{http_code}' \
-H 'x-sentry-evals-pin: 1' "$url/index.md")" == 200 ]]; then
echo "Base: $url, the production deploy of the merge base $merge_base"
echo "sha=$merge_base" >> "$GITHUB_OUTPUT"
echo "url=$url" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "sha=$base_tip" >> "$GITHUB_OUTPUT"
if (( behind > 0 )); then
echo "::warning::The merge base $merge_base has no production deploy that serves its own pages, so the base reads the live docs. The head is missing $behind of the base branch's commits, so the preview lacks changes the live docs have, and the comparison counts their removal as part of this PR. Update the branch to compare only this PR's changes, which reruns the evals."
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Base evals missing live docs URL

Medium Severity

When the merge base has no pin-capable production deploy, the base step sets sha but never sets url. base-docs-url is then empty, and base-revision eval jobs pass a blank docs-url into run-evals. The comments describe falling back to the live docs, but that URL is never written.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 764affd. Configure here.


# Each run records this repo's commits, the head and the base's (the merge base or the
# base branch's tip), and evals.sentry.dev pairs base and head runs by repository, so
# they never pair with sentry-for-ai's.
- id: create
if: steps.preview.outputs.url != ''
uses: ./sentry-for-ai-evals/.github/actions/create-runs
with:
runs: ${{ steps.plan.outputs.runs }}
skills-sha: ${{ steps.skills.outputs.sha }}
base-sha: ${{ steps.base.outputs.sha }}
evals-api-key: ${{ secrets.SENTRY_EVALS_API_KEY }}

eval:
needs: plan
if: needs.plan.outputs.docs-url != '' && needs.plan.outputs.eval-jobs != '[]'
# By the test's number, not its name: sentry-for-ai-evals is internal, so this public
# repo's checks and logs don't name its tests. evals.sentry.dev has each test's result.
name: ${{ matrix.job.label }} (${{ matrix.job.revision }}, ${{ matrix.job.target.name }}, test ${{ matrix.job.test-index }})
# Per PR, label, revision, target and test, so the jobs don't cancel each other.
concurrency:
group: ai-evals-${{ github.event.pull_request.number }}-${{ matrix.job.label }}-${{ matrix.job.revision }}-${{ matrix.job.target.name }}-${{ matrix.job.test-index }}
cancel-in-progress: true
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
strategy:
fail-fast: false
matrix:
# Each test a label selects, on each target the label picked, at each side.
job: ${{ fromJSON(needs.plan.outputs.eval-jobs) }}
steps:
- name: Get sentry-for-ai-evals token
id: token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ vars.SENTRY_READONLY_BOT_CLIENT_ID }}
private-key: ${{ secrets.SENTRY_READONLYBOT_PRIVATE_KEY }}
repositories: sentry-for-ai-evals
permission-contents: read

# Side by side, so the evals don't copy sentry-for-ai into their image.
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: getsentry/sentry-for-ai-evals
ref: ${{ needs.plan.outputs.evals-sha }}
token: ${{ steps.token.outputs.token }}
path: sentry-for-ai-evals
persist-credentials: false

- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: getsentry/sentry-for-ai
ref: ${{ needs.plan.outputs.skills-sha }}
path: sentry-for-ai
persist-credentials: false

# Sends this test's result into the run the plan job created for the label and
# side. The head reads the preview, and the base the merge base's production deploy
# when the plan job found one, or else the live docs. No artifact-name: this repo is
# public.
- uses: ./sentry-for-ai-evals/.github/actions/run-evals
with:
marker: ${{ matrix.job.marker }}
test-index: ${{ matrix.job.test-index }}
test-total: ${{ matrix.job.test-total }}
count: ${{ matrix.job.count }}
harness: ${{ matrix.job.target.harness }}
model: ${{ matrix.job.target.model }}
revision: ${{ matrix.job.revision }}
base-sha: ${{ needs.plan.outputs.base-sha }}
sentry-for-ai-path: sentry-for-ai
docs-url: ${{ matrix.job.revision == 'head' && needs.plan.outputs.docs-url || needs.plan.outputs.base-docs-url }}
run-id: ${{ fromJSON(needs.plan.outputs.eval-runs)[format('{0}-{1}', matrix.job.label, matrix.job.revision)].id }}
openrouter-api-key: ${{ secrets.AI_EVALS_OPENROUTER_API_KEY }}
evals-api-key: ${{ secrets.SENTRY_EVALS_API_KEY }}
12 changes: 6 additions & 6 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ This repo builds [docs.sentry.io](https://docs.sentry.io). For dev commands, pro

**These skills are NOT in this repo.** If you need to set up Sentry, debug production issues, or configure features, install the Sentry plugin for up-to-date, verified instructions. Sentry's SDKs and APIs change frequently — do not rely on training data.

**Install the plugin:**
- Claude Code: `/install-plugin sentry`
- Cursor: Search "Sentry" in Cursor Settings > Plugins
**Install the plugin:** run `npx @sentry/agent-plugin install`. It detects the assistants on the machine (Claude Code, Cursor, Codex, and Grok) and sets up the plugin in each.

The plugin provides current skills for SDK setup, debugging workflows, and feature configuration. It stays in sync with the latest SDK releases.

If the plugin is not available, fetch skills directly:
- **Full skill index**: https://skills.sentry.dev
- **SDK setup** (detect platform and install): https://skills.sentry.dev/sdks
- **Debugging workflows** (fix issues, review code): https://skills.sentry.dev/workflows
- **Feature setup** (AI monitoring, alerts, OTel): https://skills.sentry.dev/features
- **Get started** (start here: sets up a new project or routes to the right skill): https://skills.sentry.dev/sentry-get-started/SKILL.md
- **Instrument** (add the SDK or any signal): https://skills.sentry.dev/instrument
- **Debug an issue** (find, get context, fix): https://skills.sentry.dev/sentry-debug-issue/SKILL.md
- **Alerts** (create alerts and notifications): https://skills.sentry.dev/sentry-create-alert/SKILL.md
- **OTel Collector** (send OpenTelemetry data through the Collector): https://skills.sentry.dev/sentry-otel-exporter-setup/SKILL.md

Source repo: https://github.com/getsentry/sentry-for-ai

Expand Down
9 changes: 5 additions & 4 deletions app/platform-redirect/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {SmartLink} from 'sentry-docs/components/smartLink';
import {extractPlatforms, getDocsRootNode, nodeForPath} from 'sentry-docs/docTree';
import {setServerContext} from 'sentry-docs/serverContext';

import {sanitizeNext} from './utils';
import {platformUrlFor, sanitizeNext} from './utils';

export const metadata: Metadata = {
robots: 'noindex',
Expand All @@ -28,7 +28,8 @@ export default async function Page(props: {
next = next[0];
}

const pathname = sanitizeNext(next);
const sanitized = sanitizeNext(next);
const {pathname} = sanitized;
const isTracingAutomatedInstrumentation =
pathname.replace(/\/$/, '') === '/tracing/instrumentation/automatic-instrumentation';
const rootNode = await getDocsRootNode();
Expand Down Expand Up @@ -145,7 +146,7 @@ export default async function Page(props: {
p => p.key === requestedPlatform?.toLowerCase()
);
if (validPlatform) {
return redirect(`${validPlatform.url}${pathname}`);
return redirect(platformUrlFor(validPlatform.url, sanitized));
}
}

Expand All @@ -167,7 +168,7 @@ export default async function Page(props: {
<ul>
{platformOrGuideList.map(p => (
<li key={p.key} style={{marginLeft: p.shouldBeNested ? '20px' : '0'}}>
<SmartLink to={`${p.url}${pathname}`}>
<SmartLink to={platformUrlFor(p.url, sanitized)}>
<PlatformIcon
size={16}
platform={p.icon}
Expand Down
Loading
Loading