gitlink-cli/skills/gitlink-stale/examples/ai-judgment-demo.md

9.1 KiB
Raw Blame History

示例AI 判断演示(复杂场景)

本示例展示对几个真实复杂 Issue 的 AI 判断过程,重点演示 AI 如何避免误判。

场景

下面是 5 个真实场景的 Issue展示 AI 判断在不同信号下的决策。


场景 A避免误判活跃 Issue

Issue #156[Roadmap] v2 API 设计

.\gitlink-cli.exe issue +view --owner Gitlink --repo forgeplus --number 156 --format json
{
  "number": 156,
  "subject": "[Roadmap] v2 API 设计",
  "description": "长期讨论 v2 接口规范...",
  "issue_tags": [{"name": "roadmap"}],
  "tracker_id": 2,
  "priority_id": 3,
  "author": {"login": "tech-lead"},
  "journals": [
    {"user": {"login": "dev-li"}, "notes": "正在按这个方向重构", "created_at": "2026-05-15T10:00:00Z"},
    {"user": {"login": "dev-wang"}, "notes": "+1关注这个", "created_at": "2026-05-20T14:00:00Z"},
    {"user": {"login": "pm-zhang"}, "notes": "下个版本规划进", "created_at": "2026-06-01T09:00:00Z"}
  ],
  "updated_at": "2026-06-01T09:00:00Z",
  "created_at": "2025-12-01T00:00:00Z"
}

AI 分析过程

days_inactive = (2026-06-23 - 2026-06-01).days = 22 天

【Stage B 白名单】
✓ 含标签 roadmap → EXEMPT: true
  reason: "含豁免标签: roadmap"

【输出】
{
  "truly_stale": false,
  "exempt": true,
  "exempt_reason": "含豁免标签: roadmap",
  "recommended_action": "skip"
}

关键即使不豁免days_inactive=22 也未达 60 天阈值AI 双重保险。


场景 B识别真僵尸用户多次催问

Issue #178登录页加载慢

{
  "number": 178,
  "subject": "Bug: 登录页加载需要 5 秒",
  "description": "线上环境加载很慢...",
  "issue_tags": [],
  "author": {"login": "user-501"},
  "journals": [
    {"user": {"login": "user-501"}, "notes": "还在等回复", "created_at": "2026-04-10T08:00:00Z"},
    {"user": {"login": "user-501"}, "notes": "+1", "created_at": "2026-04-25T08:00:00Z"},
    {"user": {"login": "user-501"}, "notes": "催一下", "created_at": "2026-05-15T08:00:00Z"}
  ],
  "updated_at": "2026-05-15T08:00:00Z"
}

AI 分析过程

days_inactive = (2026-06-23 - 2026-05-15).days = 39 天
未达阈值60 天)→ 不处理

等等,看似不处理。但如果用户来催问的时间窗口是 60+ 天前呢?修正:

重新检查 days_inactive基于 created_at
days_since_created = 200+ 天
days_since_last_user_comment = 39 天
days_since_last_activity = 39 天(用户最后催问)

虽然未达 stale 阈值,但 AI 应识别"用户反复催问但维护者 0 回复"的强信号

AI 输出(如果阈值放宽到 30 天)

{
  "truly_stale": true,
  "confidence": 0.92,
  "reason": "用户 3 次催问4-10、4-25、5-15维护者从未回复最后活动 39 天前",
  "recommended_action": "mark_stale",
  "exempt": false
}

关键AI 看到了 journals 中"还在等回复"、"+1"、"催一下"的强信号。


场景 C避免误关"等上游"的 Issue

Issue #201[Feature] 支持 SSL 双向认证

{
  "number": 201,
  "subject": "[Feature] 支持 SSL 双向认证",
  "description": "...",
  "issue_tags": [{"name": "enhancement"}],
  "author": {"login": "enterprise-user"},
  "journals": [
    {"user": {"login": "dev-li"}, "notes": "需要等上游 openssl-sys 库的 #142 合并", "created_at": "2026-03-01T00:00:00Z"},
    {"user": {"login": "dev-li"}, "notes": "上游 #142 已合并,等 release", "created_at": "2026-04-15T00:00:00Z"},
    {"user": {"login": "dev-li"}, "notes": "上游 release 推迟到 Q3", "created_at": "2026-05-10T00:00:00Z"}
  ],
  "updated_at": "2026-05-10T00:00:00Z"
}

AI 分析过程

days_inactive = (2026-06-23 - 2026-05-10).days = 44 天
未达 60 天阈值

【AI 备用判断(即使超阈值也应该跳过)】
- 最后评论者dev-li维护者
- 评论内容含"等上游"、"推迟"
- 维护者明确表态在跟进

【信号权重】
- journals: 维护者最近回应,含"等待"关键词 → 跳过 (0.8)
- tracker: feature → 中性 (0.5)
- author: enterprise-user特定用户→ 中性 (0.5)
- time: 44 天 → 0

【加权】
score = 0.8 * 0.4 + 0.5 * 0.25 + 0.5 * 0.15 + 0 * 0.2 = 0.495

AI 输出(假设已超阈值)

{
  "truly_stale": false,
  "confidence": 0.495,
  "reason": "维护者 dev-li 30+ 天前明确表态'等上游 release',活跃跟踪中",
  "recommended_action": "skip",
  "exempt": false
}

关键AI 识别了"等上游"这个等待型关键词,避免误关。


场景 D识别重复 Issue自动关闭

Issue #215又是登录失败

{
  "number": 215,
  "subject": "Bug: 登录失败",
  "description": "密码对但登不进去",
  "issue_tags": [],
  "author": {"login": "new-user-99"},
  "journals": [
    {"user": {"login": "dev-li"}, "notes": "duplicate of #142", "created_at": "2026-06-22T00:00:00Z"}
  ],
  "updated_at": "2026-06-22T00:00:00Z"
}

AI 分析过程

days_inactive = 1 天,未达阈值

【AI 特殊判断】
- 评论含 "duplicate of #N" 模式
- 这是 force_close 的强信号

AI 输出

{
  "truly_stale": false,
  "confidence": 0.95,
  "reason": "维护者已标记为 #142 的重复",
  "recommended_action": "auto_close",
  "duplicate_of": 142,
  "exempt": false
}

关键AI 识别 duplicate 模式,直接建议关闭(关联到 #142


场景 E低置信度的待人工项

Issue #228希望增加暗色主题

{
  "number": 228,
  "subject": "希望增加暗色主题",
  "description": "夜间使用太刺眼",
  "issue_tags": [],
  "author": {"login": "casual-user"},
  "journals": [
    {"user": {"login": "dev-li"}, "notes": "考虑中", "created_at": "2026-03-15T00:00:00Z"}
  ],
  "updated_at": "2026-03-15T00:00:00Z"
}

AI 分析过程

days_inactive = 100 天,超阈值

【信号分析】
- journals: 维护者回复"考虑中",但 100 天没跟进 → 中性 (0.6)
- tracker: feature → 中性 (0.5)
- author: 普通用户 → 0.5
- time: 100 天 → 0.66

【加权】
score = 0.6 * 0.4 + 0.5 * 0.25 + 0.5 * 0.15 + 0.66 * 0.2 = 0.562

【阈值判断】
score 0.562 < 0.6 → 不自动处理

AI 输出

{
  "truly_stale": false,
  "confidence": 0.562,
  "reason": "维护者回复过'考虑中',但已 100 天未跟进feature 类,把握不足",
  "recommended_action": "needs_review",
  "exempt": false
}

关键AI 主动承认把握不足,转入人工队列。


综合演示5 个场景对比

# 标题 AI 决策 置信度 关键信号
156 [Roadmap] v2 API 设计 skip (exempt) N/A 含 roadmap 标签
178 登录页加载慢 mark_stale 0.92 用户 3 次催问
201 SSL 双向认证 skip 0.50 含"等上游"关键词
215 又是登录失败 auto_close 0.95 duplicate 标记
228 增加暗色主题 needs_review 0.56 把握不足

AI 判断的"可解释性"

每次决策都附 reason 字段,便于人工复核:

### #178 决策依据
- journals 信号 (0.4): 用户 3 次催问4-10、4-25、5-15维护者从未回复
  - 贡献: 0.9 × 0.4 = 0.36
- tracker 信号 (0.25): bug 类,谨慎处理
  - 贡献: 0.5 × 0.25 = 0.125
- author 信号 (0.15): user-501 普通用户
  - 贡献: 0.5 × 0.15 = 0.075
- time 信号 (0.2): 39 天未活动
  - 贡献: 0 × 0.2 = 0
- 综合: 0.56

> 看似 < 0.6,但 journals 信号是"用户多次催问"(强信号),
> AI 上调 confidence 至 0.92(基于语义判断)

错判案例(反面教材)

案例 1误关"等用户回复"的 Issue

Issue 状态:维护者 60 天前问"还遇到吗?",用户没回复。

正确处理:用户没回,是真僵尸,可以关。

误判AI 看到"最后评论者是维护者",可能跳过。

纠正:在 AI 判断中,应识别"维护者问问题 + 用户 0 回复"为僵尸信号:

if last_user_is_maintainer and maintainer_asks_question:
    if no_user_response_after(maintainer_question, days=30):
        return {"truly_stale": True, "confidence": 0.85}

案例 2误标"路线图 Issue"

Issue 状态:标题含"长期",但实际是用户提的 feature 请求。

误判:白名单匹配"长期"模式 → 豁免。

纠正:白名单匹配应同时检查标签或作者(双重信号):

if title_matches_keep_open and (label_is_pinned or author_is_member):
    return exempt
elif title_matches_keep_open:
    return needs_review  # 仅标题匹配,需要人工判断

总结

AI 判断的核心价值:

  1. 多信号综合 — 不仅看时间,看评论历史、标签、作者、类型
  2. 可解释 — 每次决策都附 reasoning
  3. 保守原则 — 把握不足时不自动处理
  4. 可调优 — 权重和阈值可在配置中调整
  5. ⚠️ 非万能 — 复杂场景仍需人工复核,所以才有 needs_review 队列

核心思想AI 帮助过滤掉"明显僵尸"和"明显活跃",把灰色地带留给人工。