update-dedupe
GitHub通过分析近期关闭的重复问题信号,自动更新本地去重技能配置。该流程聚合GitHub的重复关闭事件,识别高频重复模式并优化检测规则,从而提升Issue分类中重复项识别的准确性与效率。
Trigger Scenarios
Install
npx skills add warpdotdev/oz-for-oss --skill update-dedupe -g -y
SKILL.md
Frontmatter
{
"name": "update-dedupe",
"description": "Update the repo-local dedupe-issue-local companion skill using closed-as-duplicate signals. Use when maintainers repeatedly close issues as duplicates of the same canonical thread and that pattern should feed back into triage duplicate detection."
}
Update Dedupe
Use this skill to improve .agents/skills/dedupe-issue-local/SKILL.md from real closed-as-duplicate signals. The core skill at .agents/skills/dedupe-issue/SKILL.md is the cross-repo contract and is read-only from this loop.
This loop is focused exclusively on closed-as-duplicate signals. Other maintainer signals (re-labels, re-opens, follow-up comments) are handled by the separate update-triage loop.
Write surface
This self-improvement loop may only write to:
.agents/skills/dedupe-issue-local/(andSKILL.mdinside it)
It must NOT touch:
.agents/skills/dedupe-issue/SKILL.md(the core contract).agents/skills/triage-issue-local/SKILL.md(owned byupdate-triage)- any other core skill
The self-improvement runner enforces this via a git diff check against allowed prefixes before pushing. A violation aborts the run.
Inputs
- Optional repository override if you are not running from the target checkout.
- Optional time window override when you need something other than the default seven-day lookback.
Workflow
- Verify GitHub CLI auth:
gh auth status
- Aggregate closed-as-duplicate signals for recently closed issues with the bundled script:
python3 .agents/skills/update-dedupe/scripts/aggregate_dedupe_feedback.py
By default this targets the current repo and looks back 7 days. It collects only issues GitHub itself recorded as closed with the duplicate close reason (state_reason == "duplicate") and looks up the canonical issue each was closed against via the issue timeline's marked_as_duplicate event. Ad-hoc maintainer comments that merely mention another issue are intentionally ignored to avoid false positives. The script writes structured JSON to a temporary file and prints the path.
- Read the generated JSON and look for repeated clusters:
- two or more different reporters filed similar issues that maintainers closed as duplicates of the same canonical thread
- an explicit maintainer statement that a class of issue should always be treated as a duplicate of a canonical thread
-
Propose the smallest edit that explains the cluster. Add or update a bullet under the "Known-duplicate clusters" section of
.agents/skills/dedupe-issue-local/SKILL.mdsummarizing the canonical thread and the distinguishing signals maintainers use to identify duplicates. -
Keep the core dedupe contract stable — never edit
dedupe-issue/SKILL.md, never weaken the 2-candidate minimum, never change the similarity thresholds or the output shape.
Evidence Rules
- Only encode a cluster when at least two independent closed-as-duplicate events point at the same canonical issue, or a maintainer explicitly asks for one.
- Skip the PR when there is no repeated signal.
- Do not weaken precision-over-recall for dedupe.
Final Checks
- Re-read the updated
dedupe-issue-localcompanion skill and confirm any new clusters are explicit. - Keep the companion concise; prefer canonical links and short distinguishing notes over long prose.
- Commit any changes on a local branch named
oz-agent/update-dedupe. Do NOT push the branch; the Python entrypoint will run a write-surface guard and push only when the guard passes. - If the updates warrant a PR, it will be opened from the pushed branch. Tag
@captainsafiaas a reviewer on that PR. - Validate any temporary JSON with
jqbefore relying on it.
Version History
- 345a0f5 Current 2026-07-24 17:41


