Skip to content

Commit f94a87b

Browse files
authored
Merge pull request #21291 from getsentry/prepare-release/10.56.0
meta(changelog): Update changelog for 10.56.0
2 parents 068f747 + 165c82a commit f94a87b

261 files changed

Lines changed: 6618 additions & 1376 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/linear-project-status/SKILL.md

Lines changed: 311 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
name: linear-project-update
3+
description: Help the user draft and (with their explicit approval) post a status update to a Linear project they lead. Use whenever the user wants to "post a project update", "write a status update", "update my Linear project", "send a project update", or asks for help with weekly/biweekly project updates. Also trigger when the user pastes a Linear project URL and asks for an update, mentions wanting to write an update for their project, or wants help drafting a status message for stakeholders. Even when the user doesn't explicitly say "post" or "status update" — if the underlying request is "help me write an update for my Linear project", trigger this skill. The user always keeps final control of the words; this skill drafts a proposal and never posts without explicit confirmation in the same turn.
4+
argument-hint: <linear-project-url-or-id-or-slug-optional>
5+
---
6+
7+
# Linear Project Update
8+
9+
You are helping the user draft a status update for a Linear project they lead. The end-state is either (a) a posted update plus an optional target-date change, applied only with the user's explicit go-ahead in this turn, or (b) a draft the user takes and posts themselves.
10+
11+
The user owns the words that go out under their name. Your job is to give them a strong starting point and clear options, then get out of the way. **Never post or change anything without explicit confirmation in this turn.**
12+
13+
## Workflow
14+
15+
### Step 1 — Resolve the project
16+
17+
If the user provided a project (URL, slug, or UUID), pass whatever they gave you straight to `mcp__claude_ai_Linear__get_project` as `query` and extract the `id` (UUID) from the response. Linear's MCP accepts all three forms — don't try to parse URLs yourself.
18+
19+
If they did not provide one, help them pick:
20+
21+
1. **Get the current user's ID.** Call `mcp__claude_ai_Linear__get_user` with `query: "me"` and extract the `id` field. You'll need it for filtering in step 3.
22+
2. **List the user's projects.** Call `mcp__claude_ai_Linear__list_projects` with `member: "me"` and `orderBy: "updatedAt"`. The `member: "me"` filter returns projects the user is a member of _or_ leads — exactly the set you need, in a single call. In practice this returns a small list (usually <30 across all teams) and `hasNextPage` is false; paginate only if it isn't.
23+
24+
**Do not** list projects per team and filter client-side. `list_projects` has no direct `lead` filter, and big workspaces have hundreds of projects per team — paginating teams is slow, expensive, and unnecessary when `member: "me"` does the job in one call.
25+
26+
3. **Filter to led + active projects.** From the response, keep only projects where `lead.id == <current-user-id>`. Then drop any with `status.type` of `completed` or `canceled` — updating a Done or Canceled project almost never makes sense, and surfacing them clutters the picker. (If after this filter you have zero projects, stop and tell the user; don't fabricate. Offer the URL fallback: "paste a project URL if you want to update one you don't lead.")
27+
4. **Fetch the last-update timestamp per project, in parallel.** The project payload doesn't carry it. For each surviving project, call `mcp__claude_ai_Linear__get_status_updates` with `type: "project", project: <uuid>, limit: 1, orderBy: "createdAt"` — all in the same turn, not sequentially.
28+
5. **Sort:**
29+
- **In Progress / Started** first — most likely to be the target.
30+
- Then other active statuses (Planned, Paused, Backlog).
31+
- Within each band, put the project most likely to need an update first — typically the one with the longest gap since its last status update.
32+
6. **Present the list with `AskUserQuestion`.** Format each option so the user can see at a glance which projects need attention:
33+
34+
`<Project name> — status: <Status> · target: <YYYY-MM-DD or "—"> · last update: <X days ago or "never">`
35+
36+
7. Once picked, continue with that project's UUID.
37+
38+
### Step 2 — Audit project status
39+
40+
Invoke the **`linear-project-status`** skill on the resolved project UUID. That skill produces the health verdict, top concerns, dimension breakdown, recent activity, and blocker analysis you'll need to write a useful update.
41+
42+
Keep the audit output handy — you'll cite specifics in the proposal (e.g., "3 issues stale > 14 days", "target date in 12 days with 8 issues still open", "no movement on issues in the last 7 days"). Generic updates are useless; concrete ones build trust.
43+
44+
### Step 3 — Gather additional context
45+
46+
The audit tells you what Linear knows. The user knows what Linear doesn't. Ask once, broadly, rather than peppering them with separate questions:
47+
48+
> "Anything I should know that isn't in Linear before I draft this? PTO or absences (yours or the team's), blockers, competing priorities, or general context you want stakeholders to hear. Or just say 'no' to skip."
49+
50+
Wait for their reply. Treat any short negation as a valid skip — "no", "nope", "skip", "nothing", or an empty reply all mean "proceed without extra context". Don't re-prompt.
51+
52+
### Step 4 — Draft the proposal
53+
54+
Synthesize the audit + the user's context into two things: a target-date recommendation and an update body.
55+
56+
#### Target date recommendation
57+
58+
Recommend whatever the audit and the user's context actually support — but be cautious about small moves. A few-day push tends to signal indecision and erodes trust in the date.
59+
60+
- **Realistic** (audit and remaining scope support it): recommend **no change**, even if the date feels a little uncomfortable. Say so explicitly: "Target stays at <date>."
61+
- **Unrealistic** (audit flagged target as `warn`/`bad`, or the date is already in the past): recommend a new date with real headroom given the open scope. Default to moving it out by at least a week — but if a shorter move genuinely fits the situation (e.g., a launch tied to a known external date a few days out, or the user's context makes a sub-week shift obviously right), recommend that and explain why.
62+
- **If you propose a sub-week move** (or the user later asks for one): flag it explicitly so they can reconsider. Something like: "This is only N days out from the current target — small moves often look like indecision. Want to either hold the date or push to <date-≥-1-week-out> instead?" Then defer to the user's call.
63+
64+
When recommending any new date, justify it in one line tied to audit specifics: "8 of 15 issues still open with 5 days to target — propose pushing to <date>."
65+
66+
#### Update body
67+
68+
A good status update is:
69+
70+
- **Short.** A few paragraphs at most. Stakeholders skim.
71+
- **Concrete.** "Shipped X and Y; in flight on Z; blocked on W" beats "made progress on several fronts".
72+
- **Honest about risks.** If the audit flagged a blocker or staleness, name it; don't paper over.
73+
- **Forward-looking.** What's the next deliverable and by when.
74+
75+
Cover, in roughly this order:
76+
77+
1. **Since the last update** — what shipped, what moved. Pull from the audit's recent-activity data and from the user-supplied context.
78+
2. **What's next** — the immediate next milestone or deliverable.
79+
3. **Risks / blockers** — name them. Use any blocker context the user provided.
80+
4. **Target date** — only mention if you're proposing a change, or if explicit reaffirmation is useful.
81+
82+
**Match the user's voice.** Read the last 2–3 status updates on this project before drafting. If the user writes in conversational paragraphs, don't return a bulleted formal report. If they use bullets and headers, match that. Mismatched tone is the fastest way to make the user feel the draft isn't theirs.
83+
84+
### Step 5 — Present and get the user's call
85+
86+
Show both proposals together in the chat:
87+
88+
```
89+
**Proposed target date:** <new date or "no change"> — <one-line reason>
90+
91+
**Proposed update:**
92+
93+
<draft body>
94+
```
95+
96+
Then use `AskUserQuestion` to offer three choices:
97+
98+
1. **Submit as-is** — post the update and apply the target-date change (if any).
99+
2. **Adjust first** — iterate on the draft with feedback, re-present, then ask again.
100+
3. **Stop here** — user takes the draft and handles it themselves.
101+
102+
If they pick "Adjust first", treat it as collaborative editing, not a from-scratch rewrite. Preserve what they liked. Loop back through Step 5 after each revision.
103+
104+
### Step 6 — Apply changes (only on explicit go-ahead)
105+
106+
Only if the user explicitly approved in Step 5:
107+
108+
1. If a target-date change was approved, call `mcp__claude_ai_Linear__save_project` with the new `targetDate`.
109+
2. Call `mcp__claude_ai_Linear__save_status_update` with the project ID and final body. Set `health` from the audit verdict (Green → `onTrack`, Yellow → `atRisk`, Red → `offTrack`); if Linear's MCP rejects those enum values, check the schema and pick the closest valid one rather than guessing repeatedly.
110+
3. Confirm both succeeded and link the user to the project's overview.
111+
112+
If any call fails, surface the exact error and stop. Do not retry silently or fudge the user's understanding of what's actually in Linear.
113+
114+
## What to never do
115+
116+
- Post a status update or change a target date without the user's explicit "go" in this turn. A choice from earlier in the conversation does not count if the draft has since changed.
117+
- Move a target date by a few days "just to be safe" without flagging it. Small moves erode trust in the date; if you (or the user) propose one, explicitly surface it so they're making the call with eyes open.
118+
- Fabricate context — blockers, accomplishments, PTO, dates. If you don't know it, ask or omit it. Stakeholders will read this; wrong details damage the user's credibility.
119+
- Override the user's voice. Suggest a wording change once; if they push back, drop it.
120+
- Aim for comprehensive. A short, honest update beats a long one that buries the lede.

.agents/skills/triage-issue/SKILL.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ Cross-repo searches (only when clearly relevant):
8282

8383
**Shell safety:** Strip shell metacharacters from issue-derived search terms before use in commands.
8484

85+
#### Changelog investigation (when a version is mentioned)
86+
87+
If the issue states a version where the problem started (e.g. "works in 7.x, broken since 8.2.0"), **check `CHANGELOG.md`** for that version range.
88+
Use the **Grep** tool (pattern `^## ` on `CHANGELOG.md`) to list version headings, then use the **Read** tool to read the relevant entries. Do NOT use Bash `grep`/`head` — the native Grep/Read tools are read-only and require no extra Bash permissions in CI.
89+
Surface any relevant changelog delta in the triage report under **Root cause** or **Information gaps**. If nothing relevant is found, note that explicitly.
90+
8591
### Step 4: Related Issues & PRs
8692

8793
- Search for duplicate or related issues: `gh api search/issues -X GET -f "q=<terms>+repo:getsentry/sentry-javascript+type:issue"` and use the **Write** tool to save the command output to `search.json` in the workspace root

.agents/skills/triage-issue/scripts/detect_prompt_injection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def is_non_latin(c: str) -> bool:
121121
(r"\b(admin|developer|system)[\s_-]mode", 8, "Mode manipulation"),
122122

123123
# Sensitive file paths (10 points) - legitimate issues rarely reference these
124-
(r"(~/\.aws/|~/\.ssh/|/root/|/etc/passwd|/etc/shadow)", 10, "System credentials path"),
124+
(r"(~/\.aws/|~/\.ssh/|(?<!\w)/root/|/etc/passwd|/etc/shadow)", 10, "System credentials path"),
125125
(r"(\.aws/credentials|id_rsa|\.ssh/id_)", 10, "Credentials file reference"),
126126

127127
# Environment variable exfiltration (8 points)

.agents/skills/vendor-otel/SKILL.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ description: Vendor an OpenTelemetry instrumentation package into the Sentry Jav
99

1010
Copy upstream OTel instrumentation TypeScript source into a `vendored/` directory, remove the npm dependency, and ensure builds and tests pass. No logic changes — the vendored code must behave identically to the original.
1111

12+
**Scope of this rule:** "No logic changes" applies **only to the initial vendoring PR**. After a package has been vendored, the `vendored/` directory is Sentry-owned source and follow-up PRs may refactor, simplify, replace upstream utilities with Sentry equivalents (e.g. `@opentelemetry/core``@sentry/core`), or otherwise diverge from upstream. Such cleanup is desired, not discouraged.
13+
1214
## 1. Research
1315

1416
Find upstream source files:

.craft.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ targets:
1616
- name: npm
1717
id: '@sentry/node-core'
1818
includeNames: /^sentry-node-core-\d.*\.tgz$/
19+
- name: npm
20+
id: '@sentry-internal/server-utils'
21+
includeNames: /^sentry-internal-server-utils-\d.*\.tgz$/
1922
## 1.3 Browser Utils package
2023
- name: npm
2124
id: '@sentry-internal/browser-utils'

.github/workflows/build.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ jobs:
537537
- name: Set up Deno
538538
uses: denoland/setup-deno@v2.0.4
539539
with:
540-
deno-version: v2.1.5
540+
deno-version: ${{ matrix.deno-version || 'v2.8.0' }}
541541
- name: Restore caches
542542
uses: ./.github/actions/restore-cache
543543
with:
@@ -984,7 +984,7 @@ jobs:
984984
node-version-file: 'dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/package.json'
985985
- name: Set up Bun
986986
if:
987-
contains(fromJSON('["node-exports-test-app","nextjs-16-bun", "elysia-bun", "hono-4"]'),
987+
contains(fromJSON('["node-exports-test-app","nextjs-16-bun", "elysia-bun", "hono-4", "bun-bytecode"]'),
988988
matrix.test-application)
989989
uses: oven-sh/setup-bun@v2
990990
with:
@@ -996,10 +996,12 @@ jobs:
996996
use-installer: true
997997
token: ${{ secrets.GITHUB_TOKEN }}
998998
- name: Set up Deno
999-
if: matrix.test-application == 'deno' || matrix.test-application == 'deno-streamed'
999+
if:
1000+
matrix.test-application == 'deno' || matrix.test-application == 'deno-streamed' || matrix.test-application ==
1001+
'deno-redis'
10001002
uses: denoland/setup-deno@v2.0.4
10011003
with:
1002-
deno-version: ${{ matrix.deno-version || 'v2.1.5' }}
1004+
deno-version: ${{ matrix.deno-version || 'v2.8.0' }}
10031005
- name: Restore caches
10041006
uses: ./.github/actions/restore-cache
10051007
with:
@@ -1122,7 +1124,7 @@ jobs:
11221124
if: matrix.test-application == 'deno' || matrix.test-application == 'deno-streamed'
11231125
uses: denoland/setup-deno@v2.0.4
11241126
with:
1125-
deno-version: ${{ matrix.deno-version || 'v2.1.5' }}
1127+
deno-version: ${{ matrix.deno-version || 'v2.8.0' }}
11261128
- name: Restore caches
11271129
uses: ./.github/actions/restore-cache
11281130
with:

.github/workflows/triage-issue.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ jobs:
7474
Do NOT use `python3 -c` or other inline Python in Bash, only the provided scripts are allowed.
7575
Do NOT attempt to delete (`rm`) temporary files you create.
7676
claude_args: |
77+
--model claude-opus-4-8
7778
--max-turns 50 --allowedTools "Write,Bash(gh api *),Bash(gh pr list *),Bash(npm info *),Bash(npm ls *),Bash(python3 .claude/skills/triage-issue/scripts/post_linear_comment.py *),Bash(python3 .claude/skills/triage-issue/scripts/parse_gh_issues.py *),Bash(python3 .claude/skills/triage-issue/scripts/detect_prompt_injection.py *),Bash(python3 .claude/skills/triage-issue/scripts/write_job_summary.py *)"
7879
7980
- name: Post triage job summary

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ packages/**/*.junit.xml
6868
# Local Claude Code settings that should not be committed
6969
.claude/settings.local.json
7070
.claude/worktrees
71+
.claude/scheduled_tasks.lock
7172

7273
# Triage report
7374
**/triage_report.md

.oxlintrc.base.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"plugins": ["typescript", "import", "jsdoc", "vitest"],
44
"rules": {
55
"no-unused-vars": [
6-
"warn",
6+
"error",
77
{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_", "caughtErrorsIgnorePattern": "^_" }
88
],
99

@@ -55,7 +55,7 @@
5555
"typescript/prefer-optional-chain": ["error"],
5656
"typescript/no-redundant-type-constituents": "off",
5757
"typescript/restrict-template-expressions": "off",
58-
"typescript/await-thenable": "warn",
58+
"typescript/await-thenable": "error",
5959
"typescript/no-base-to-string": "off"
6060
}
6161
},

0 commit comments

Comments
 (0)