前端开发
用 Sentry 归档前端项目非可操作噪音问题时如何安全分类…
在 Sentry 的 javascript 项目中,对未解决的新 issue 做分诊,只归档非可操作的噪音,绝不 resolve,且始终用 untilEscalating。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Sentry 归档前端项目非可操作噪特定
解决思路
- 硬性规则(覆盖一切):只操作 organizationSlug=sentry、项目 slug 为 javascript;若被要求分诊其他项目,停下来让用户确认。
- 只允许归档:唯一允许的状态变更是 status=ignored;绝不 resolve、绝不 unresolve、绝不 assign、绝不 delete、绝不批量更新 status 以外的字段。
- 始终使用 ignoreMode=untilEscalating;绝不使用 forever、forDuration、untilOccurrenceCount、untilUserCount;若用户要求其他模式,停下来让其手动归档。
- 始终附带 reason:一句简短、事实性的句子,点名 references/archive-criteria.md 中的类别(例如 “Third-party library noise — echarts internals; not actionable in our code”)。
- 绝不触碰未解决队列之外的问题:跳过 status 为 resolved、ignored 或 reprocessing 的 issue。
- 未经确认绝不归档:先构建完整计划展示给用户,等待明确批准后再调用 update_issue;一次批准只覆盖所展示的计划,新批次需重新批准。
- 拿不准就跳过:若某 issue 可能是我们代码中的真实 bug,不要归档,在计划中标记为 needs-human 并附一行说明。
- 前置条件:Sentry MCP 需通过 mcp.sentry.dev 认证,所需工具为 search_issues、get_sentry_resource、update_issue;若 update_issue 不可用,停下来让用户认证 Sentry MCP server。
- 解析 $ARGUMENTS:Sentry issue URL 或短 ID(JAVASCRIPT-…)表示分诊单个 issue;含冒号的查询(如 is:unresolved firstSeen:-24h)用作搜索查询;为空则用默认队列 is:unresolved is:unassigned firstSeen:-7d,sort 为 new,limit 为 50;若含义模糊,先让用户澄清再搜索。
- 加载队列:单个 issue 时调用 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 和 stack-frame 提示。
- 立即跳过满足以下任一条件的 issue:status 不是 unresolved;assignedTo 是某个人;assignedTo 是 frontend/issues 以外的团队且看起来是团队专属的。
- 阅读 references/archive-criteria.md 获取类别分类法及识别启发式与示例,对每个候选 issue 给出 archive、skip 或 needs-human 三种决策之一。
- 评估时按顺序权衡信号:1) 顶部非 Sentry-SDK 栈帧若在 node_modules/、chrome-extension://、第三方 host 或 <unknown>,是强归档信号;2) 标题模式;3) 数量不是否决项,高数量若顶部帧是第三方仍可归档,数量本身也不强制归档;4) 时效性,单事件且超过 30 天无复发的通常是噪音;5) 客户组织分布,若事件仅来自一个客户子域(检查 customerDomain.subdomain 标签),很可能是客户环境噪音。
- 构建计划:输出一个 Markdown 表格,列为 #、Issue、Title、Volume、Decision、Category、Reason,随后汇总计数 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.” 结尾。
- 批准后应用:用户回复 apply 或 apply <subset> 时,对每个已批准 issue 调用 update_issue(organizationSlug='sentry', issueId=<shortId>, status='ignored', ignoreMode='untilEscalating', reason=<category-tagged reason from the plan>),顺序执行而非并行;若某次调用失败,记录失败、继续处理其余 issue,并在第 5 步报告失败的 ID。
- 若用户回复 cancel 或要求修改计划,不要调用 update_issue;若回复编辑(如 “change row 2 to skip”),从头重建计划并重新确认。
- 报告:应用后输出 Triage report,包含 Archived、Skipped、Needs human review、Failures(含 issue ID)数量,以及可折叠的已归档 issue 列表(JAVASCRIPT-XXXX — <reason>)。
- 恢复处理:若 update_issue 在某一项失败,记录失败并继续其余项,最后报告失败 ID;若用户发现归档错误,让其自行在 Sentry 中取消归档,本技能绝不自动撤销自身操作;若用户要求 “redo the plan with these tweaks”,从头重新生成计划,不要假设之前的计划仍适用。
- reason 语气示例: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).
适用边界 · 注意事项
- 不适用于 sentry/javascript 以外的项目,除非用户明确确认。
- 不适用于需要 resolve、assign、delete 或非 untilEscalating 归档的场景。
- 不适用于无法访问 Sentry MCP 或 update_issue 工具不可用时。