#!/bin/bash
###############################################################################
# self-growth check.sh — 扫描错误信号，输出需要记录经验的偏差项
#
# 数据来源：
#   1. llm-wiki/audit/ 中未处理的反馈文件（人类纠错）
#   2. llm-wiki/audit/resolved/ 中已处理但未提取经验的反馈
#   3. governance / self-verification / todo-agent-executor 的真实异常报告
#
# 输出：JSON 数组 [{ dimension, severity, title, detail, candidateType, sourceRef, createTodo }]
# 退出码：0 = 无新信号，1 = 有待处理信号
###############################################################################

set -uo pipefail
TARGET="."
while [[ $# -gt 0 ]]; do
  case "$1" in
    --target) TARGET="$2"; shift 2 ;;
    *) shift ;;
  esac
done

PROJECT_ROOT="$(cd "$TARGET" 2>/dev/null && pwd)"
WORKSPACE_ROOT="$PROJECT_ROOT/.astraworks"

ISSUES="[]"

source_ref_recorded() {
  local source_ref="$1"
  [ -d "$WORKSPACE_ROOT/experience" ] || return 1
  grep -R -F -q -- "$source_ref" "$WORKSPACE_ROOT/experience" 2>/dev/null
}

add_issue() {
  local dimension="$1" severity="$2" title="$3" detail="$4" ctype="$5" source_ref="$6"
  source_ref_recorded "$source_ref" && return 0
  ISSUES=$(echo "$ISSUES" | python3 -c "
import sys, json
issues = json.load(sys.stdin)
issues.append({
    'dimension': '$dimension',
    'severity': '$severity',
    'title': '''$(echo "$title" | sed "s/'/'\\\\''/g")''',
    'detail': '''$(echo "$detail" | sed "s/'/'\\\\''/g")''',
    'candidateType': '$ctype',
    'sourceRef': '$source_ref',
    'createTodo': False
})
print(json.dumps(issues, ensure_ascii=False))
")
}

# ── 1. 扫描 audit/ 中未处理的反馈 ──────────────────────────────────────────
AUDIT_DIR="$WORKSPACE_ROOT/llm-wiki/audit"
if [ -d "$AUDIT_DIR" ]; then
  for f in "$AUDIT_DIR"/*.md; do
    [ -f "$f" ] || continue
    [[ "$(basename "$f")" == ".gitkeep" ]] && continue
    # 提取标题和严重级别
    title=$(grep -m1 "^title:" "$f" 2>/dev/null | sed 's/^title:[[:space:]]*//' || echo "audit反馈")
    severity=$(grep -m1 "^severity:" "$f" 2>/dev/null | sed 's/^severity:[[:space:]]*//' || echo "medium")
    filename=$(basename "$f")
    add_issue "self-growth" "$severity" "audit反馈待处理: $title" "文件: ${filename}。需要提取为经验记录。" "record" "audit:${filename}"
  done
fi

report_value() {
  local file="$1" key="$2"
  sed -n "/^---$/,/^---$/p" "$file" | grep -m1 "^${key}:" | sed "s/^${key}:[[:space:]]*//"
}

scan_failure_reports() {
  local loop_slug="$1" prefix="$2" default_severity="$3"
  local report_dir="$WORKSPACE_ROOT/reports/loops/$loop_slug"
  [ -d "$report_dir" ] || return 0
  for f in "$report_dir"/*.md; do
    [ -f "$f" ] || continue
    [[ "$(basename "$f")" == ".gitkeep" ]] && continue
    outcome=$(report_value "$f" "outcome")
    status=$(report_value "$f" "status")
    case "$outcome:$status" in
      findings:*|blocked:*|error:*|*:error) ;;
      *) continue ;;
    esac
    title=$(report_value "$f" "title")
    severity=$(report_value "$f" "severity")
    [ -n "$severity" ] || severity="$default_severity"
    filename=$(basename "$f")
    add_issue "self-growth" "$severity" "$prefix: $title" "报告: ${loop_slug}/${filename}。仅真实异常状态可提取为经验。" "record" "report:${loop_slug}/${filename}"
  done
}

scan_failure_reports "governance" "governance偏差待提取" "medium"
scan_failure_reports "self-verification" "验证失败待提取" "high"
scan_failure_reports "todo-agent-executor" "智能体执行失败待提取" "medium"

# ── 输出 ────────────────────────────────────────────────────────────────────
echo "$ISSUES" | python3 -c "
import sys, json
issues = json.load(sys.stdin)
sev_order = {'critical': 0, 'high': 1, 'medium': 2, 'low': 3}
issues.sort(key=lambda x: (sev_order.get(x['severity'], 9), x['dimension'], x['title']))
print(json.dumps(issues, ensure_ascii=False, indent=2))
"
issue_count=$(echo "$ISSUES" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))")
[ "$issue_count" -gt 0 ] && exit 1
exit 0
