triage-frontend-issues

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Triage Frontend Issues

前端问题分类处理

Archive non-actionable noise from the
sentry/javascript
issue queue: only archive, always
untilEscalating
, always with a stated reason. Issues that look actionable in our code, or that you cannot confidently classify, must be skipped.
归档Sentry
javascript
问题队列中无操作价值的噪声:仅执行归档操作,始终使用
untilEscalating
模式,且必须注明原因。对于看起来在我们代码中有操作价值的问题,或者你无法自信分类的问题,必须跳过。

Hard Rules

硬性规则

These rules override anything else. Do not relax them.
  1. Project scope. Only operate on
    organizationSlug=sentry
    , project slug
    javascript
    . If asked to triage a different project, stop and ask the user to confirm.
  2. Archive only. The only status mutation permitted is
    status=ignored
    . Never resolve, never unresolve, never assign, never delete, never bulk-update fields other than status.
  3. Always
    untilEscalating
    .
    Use
    ignoreMode=untilEscalating
    . Never use
    forever
    ,
    forDuration
    ,
    untilOccurrenceCount
    , or
    untilUserCount
    . If the user asks for a different mode, stop and have them archive that issue manually — this skill does not perform non-escalating archives.
  4. Always include a
    reason
    .
    The
    reason
    must be a short, factual sentence naming the category from
    references/archive-criteria.md
    (e.g., "Third-party library noise — echarts internals; not actionable in our code").
  5. Never touch issues outside the unresolved queue. Skip anything with
    status
    of
    resolved
    ,
    ignored
    , or
    reprocessing
    .
  6. Never archive without confirmation. Build a full plan, show it to the user, wait for explicit approval before calling
    update_issue
    . A single approval covers the displayed plan only; new batches need new approval.
  7. When in doubt, skip. If an issue could plausibly be a real bug in our code, do not archive it. Surface it as
    needs-human
    in the plan with a one-line note.
这些规则优先于其他任何要求,不得放宽。
  1. 项目范围:仅对
    organizationSlug=sentry
    、项目slug为
    javascript
    的项目操作。如果被要求分类处理其他项目,请停止并让用户确认。
  2. 仅归档:唯一允许的状态变更为
    status=ignored
    。绝不标记解决、取消解决、分配、删除,绝不批量更新状态以外的字段。
  3. 始终使用
    untilEscalating
    :使用
    ignoreMode=untilEscalating
    。绝不使用
    forever
    forDuration
    untilOccurrenceCount
    untilUserCount
    。如果用户要求使用其他模式,请停止并让他们手动归档该问题——本skill不执行非升级型归档。
  4. 必须包含
    reason
    reason
    必须是简短、符合事实的句子,引用
    references/archive-criteria.md
    中的类别(例如:"第三方库噪声 — echarts内部逻辑;在我们的代码中无操作价值")。
  5. 绝不处理未解决队列以外的问题:跳过任何
    status
    resolved
    ignored
    reprocessing
    的问题。
  6. 未经确认绝不归档:制定完整计划,展示给用户,等待明确批准后再调用
    update_issue
    。一次批准仅适用于展示的计划;新批次需要新的批准。
  7. 存疑则跳过:如果某个问题可能是我们代码中的真实bug,请勿归档。在计划中标记为
    needs-human
    并附上一行说明。

Prerequisites

前置条件

  • Sentry MCP authenticated via
    mcp.sentry.dev
    . Required tools:
    search_issues
    ,
    get_sentry_resource
    ,
    update_issue
    .
  • If
    update_issue
    is not available, stop and ask the user to authenticate the Sentry MCP server.
  • 通过
    mcp.sentry.dev
    完成Sentry MCP认证。所需工具:
    search_issues
    get_sentry_resource
    update_issue
  • 如果
    update_issue
    不可用,请停止并让用户认证Sentry MCP服务器。

Inputs

输入

$ARGUMENTS
is one of:
Input shapeMeaning
Sentry issue URL (
https://sentry.sentry.io/issues/JAVASCRIPT-…
)
Triage that single issue.
Issue short ID (
JAVASCRIPT-…
)
Triage that single issue.
Sentry issue query (contains a colon, e.g.
is:unresolved firstSeen:-24h
)
Use as the search query.
EmptyUse the default triage queue:
is:unresolved is:unassigned firstSeen:-7d
, sort
new
, limit
50
.
If
$ARGUMENTS
is ambiguous, ask the user to clarify before searching.
$ARGUMENTS
为以下之一:
输入格式含义
Sentry问题URL(
https://sentry.sentry.io/issues/JAVASCRIPT-…
分类处理该单个问题。
问题短ID(
JAVASCRIPT-…
分类处理该单个问题。
Sentry问题查询(包含冒号,例如
is:unresolved firstSeen:-24h
用作搜索查询。
空值使用默认分类队列:
is:unresolved is:unassigned firstSeen:-7d
,按
new
排序,限制
50
条。
如果
$ARGUMENTS
含义模糊,请在搜索前让用户澄清。

Workflow

工作流

1. Load the queue

1. 加载队列

For single-issue input:
  • Call
    get_sentry_resource(url=<issue-url>)
    or
    get_sentry_resource(resourceType='issue', organizationSlug='sentry', resourceId=<shortId>)
    .
  • Confirm
    Project
    is the javascript frontend project. If not, stop.
For query/default input:
  • Call
    search_issues(organizationSlug='sentry', projectSlugOrId='javascript', query=<query>, sort='new', limit=50)
    .
  • Then call
    get_sentry_resource
    for each result in parallel to get culprit, substatus, assignee, and stack-frame hints (the search response omits some fields).
Skip immediately if any of these are true on an issue:
  • status
    is not
    unresolved
    (already archived, resolved, or in reprocessing).
  • assignedTo
    is set to a human (someone is already owning it).
  • assignedTo
    is set to a team other than
    frontend
    /
    issues
    and the issue looks team-specific (let the owning team triage).
对于单个问题输入:
  • 调用
    get_sentry_resource(url=<issue-url>)
    get_sentry_resource(resourceType='issue', organizationSlug='sentry', resourceId=<shortId>)
  • 确认
    Project
    为javascript前端项目。如果不是,请停止。
对于查询/默认输入:
  • 调用
    search_issues(organizationSlug='sentry', projectSlugOrId='javascript', query=<query>, sort='new', limit=50)
  • 然后并行调用
    get_sentry_resource
    获取每个结果的culprit、substatus、assignee和栈帧提示(搜索响应会省略部分字段)。
如果问题符合以下任一条件,立即跳过:
  • status
    不是
    unresolved
    (已归档、已解决或正在重新处理)。
  • assignedTo
    已分配给人工用户(已有专人负责)。
  • assignedTo
    已分配给
    frontend
    /
    issues
    以外的团队,且问题看起来是该团队专属的(由所属团队自行分类处理)。

2. Classify each issue

2. 分类每个问题

Read
references/archive-criteria.md
for the category taxonomy with recognition heuristics and examples. For each candidate issue, produce one of:
DecisionMeaning
archive
Matches a documented category; include the category name in the reason.
skip
Could be a real bug in our code, or insufficient evidence; do not archive.
needs-human
Looks like noise but doesn't cleanly fit a category, or volume is unusually high; flag for user review.
When evaluating, weight these signals (in this order):
  1. Top non-Sentry-SDK frame. If the top in-app frame is in
    node_modules/
    ,
    chrome-extension://
    , a third-party host, or
    <unknown>
    , this is a strong archive signal.
  2. Title pattern. Many archives are recognizable from the title alone (see criteria reference).
  3. Volume is not a veto. Some high-volume issues (10k+ events, thousands of users) are still archive-worthy if the top frame is third-party. Volume alone never forces archive either.
  4. Recency. Single-event issues older than 30 days with no recurrence are usually noise.
  5. Customer org spread. If events come from one customer subdomain only (check
    customerDomain.subdomain
    tag), it is likely customer-environment noise.
阅读
references/archive-criteria.md
获取类别分类体系、识别规则和示例。对于每个候选问题,给出以下决策之一:
决策含义
archive
匹配文档中的某个类别;在原因中包含类别名称。
skip
可能是我们代码中的真实bug,或证据不足;请勿归档。
needs-human
看起来是噪声但无法明确匹配类别,或出现量异常高;标记为需要用户审核。
评估时,按以下顺序权重这些信号:
  1. 顶部非Sentry-SDK栈帧:如果顶部应用内栈帧位于
    node_modules/
    chrome-extension://
    、第三方主机或
    <unknown>
    中,这是强烈的归档信号。
  2. 标题模式:许多可归档问题仅从标题即可识别(参见标准参考)。
  3. 出现量不构成否决:某些高出现量问题(10k+事件、数千用户)如果顶部栈帧是第三方的,仍值得归档。出现量本身也不会强制归档。
  4. 时效性:超过30天无复发的单事件问题通常是噪声。
  5. 客户组织分布:如果事件仅来自一个客户子域名(检查
    customerDomain.subdomain
    标签),则很可能是客户环境噪声。

3. Build the plan

3. 制定计划

Output one Markdown table to the user, in this exact shape:
undefined
向用户输出一个Markdown表格,格式必须如下:
undefined

Triage plan — sentry/javascript (<N> candidates)

Triage plan — sentry/javascript (<N> candidates)

#IssueTitleVolumeDecisionCategoryReason
1JAVASCRIPT-XXXXTypeError: ...12e/3uarchivebrowser-api-noiseBrowser clipboard permission denied; not actionable.
2JAVASCRIPT-YYYY<unknown>4945e/123uneeds-humanHigh volume, no title — please review before archiving.
3JAVASCRIPT-ZZZZZodError: ...360e/132uskipSchema validation failure in our code; looks actionable.

Then summarize counts: `N archive / M skip / K needs-human`. End with:
Reply
apply
to archive the N issues marked
archive
,
apply N,M,...
to archive a subset, or
cancel
to take no action.
undefined
#IssueTitleVolumeDecisionCategoryReason
1JAVASCRIPT-XXXXTypeError: ...12e/3uarchivebrowser-api-noiseBrowser clipboard permission denied; not actionable.
2JAVASCRIPT-YYYY<unknown>4945e/123uneeds-humanHigh volume, no title — please review before archiving.
3JAVASCRIPT-ZZZZZodError: ...360e/132uskipSchema validation failure in our code; looks actionable.

然后汇总数量:`N archive / M skip / K needs-human`。结尾附上:
Reply
apply
to archive the N issues marked
archive
,
apply N,M,...
to archive a subset, or
cancel
to take no action.
undefined

4. Apply on approval

4. 获批准后执行

When the user replies
apply
(or
apply <subset>
):
For each issue in the approved set, call:
update_issue(
  organizationSlug='sentry',
  issueId=<shortId>,
  status='ignored',
  ignoreMode='untilEscalating',
  reason=<category-tagged reason from the plan>,
)
Run these sequentially (not in parallel). If a call fails, log the failure, continue with the remaining issues, and report the failed IDs in step 5.
If the user replies
cancel
or asks to modify the plan, do NOT call
update_issue
. If they reply with edits ("change row 2 to skip"), rebuild the plan and re-confirm.
当用户回复
apply
(或
apply <subset>
)时:
对于批准集中的每个问题,调用:
update_issue(
  organizationSlug='sentry',
  issueId=<shortId>,
  status='ignored',
  ignoreMode='untilEscalating',
  reason=<category-tagged reason from the plan>,
)
按顺序执行(而非并行)。如果调用失败,记录失败信息,继续处理剩余问题,并在步骤5中报告失败的ID。
如果用户回复
cancel
或要求修改计划,请勿调用
update_issue
。如果他们回复修改请求(如"将第2行改为skip"),重新制定计划并再次确认。

5. Report

5. 报告

After applying, output:
undefined
执行完成后,输出:
undefined

Triage report

Triage report

  • Archived: N
  • Skipped: M
  • Needs human review: K
  • Failures: F (with issue IDs)
<details><summary>Archived issues</summary>
  • JAVASCRIPT-XXXX — <reason>
  • ...
</details> ```
  • Archived: N
  • Skipped: M
  • Needs human review: K
  • Failures: F (with issue IDs)
<details><summary>Archived issues</summary>
  • JAVASCRIPT-XXXX — <reason>
  • ...
</details> ```

Recovery

恢复机制

  • If
    update_issue
    fails on one item, log the failure and continue with the rest. Report failed IDs at the end.
  • If the user notices a wrong archive, the user can unarchive it themselves in Sentry. The skill never reverses its own actions automatically.
  • If the user asks "redo the plan with these tweaks" mid-flow, regenerate the plan from scratch — do not assume the previous plan still applies.
  • 如果
    update_issue
    在某个问题上失败,记录失败信息并继续处理其余问题。最后报告失败的ID。
  • 如果用户发现错误归档,可自行在Sentry中取消归档。本skill不会自动撤销自身操作。
  • 如果用户在流程中途要求"按这些调整重新制定计划",请从头重新生成计划——不要假设之前的计划仍然适用。

Example reasons (use this voice)

示例原因(使用此语气)

  • Third-party library noise — echarts tooltip; not actionable in our code.
  • Browser API permission noise — Clipboard writeText denied by user agent.
  • Customer-environment proxy interference — 200 response treated as error (HTML body from corporate proxy).
  • Transient backend 5xx — InternalServerError on /api/0/organizations/.../events-meta/; backend transient.
  • Test/synthetic event — smoke test or security probe, not production traffic.
  • Wrong project — Prisma/Python error mis-routed to frontend project.
  • Single-event fluke — 1 event, 1 user, no recurrence in 30+ days.
  • Browser extension noise — ReferenceError for extension-injected global (DarkReader/WeixinJSBridge).
  • Third-party library noise — echarts tooltip; not actionable in our code.
  • Browser API permission noise — Clipboard writeText denied by user agent.
  • Customer-environment proxy interference — 200 response treated as error (HTML body from corporate proxy).
  • Transient backend 5xx — InternalServerError on /api/0/organizations/.../events-meta/; backend transient.
  • Test/synthetic event — smoke test or security probe, not production traffic.
  • Wrong project — Prisma/Python error mis-routed to frontend project.
  • Single-event fluke — 1 event, 1 user, no recurrence in 30+ days.
  • Browser extension noise — ReferenceError for extension-injected global (DarkReader/WeixinJSBridge).