Files
knowledge-governance/internal/qaopsquality/rates.go
T
姚章浩 828c2c5fa0
build / build (push) Successful in 1m6s
feat(qa-ops): 按确认口径补齐质量比例与分母明细
使用完整筛选范围的当前有效结论计算覆盖率和正确率,人工优先,失效与对应待确认/未评估/不计入排除;零分母返回null,界面展示原始分子分母和排除构成,前端拒绝不守恒或比例不一致的响应。

验证:make verify退出码0,Go658及前端257通过,91项声明可选集成跳过;隔离PG、三包竞态及合成/真实只读源浏览器验证通过。无新增迁移,不接AI模型,不改绩效,不写源库;本批未推送或部署,8088运行版保持0.1.21。
2026-10-18 02:00:31 +08:00

73 lines
1.9 KiB
Go

package qaopsquality
type Rate struct {
Numerator int `json:"numerator"`
Denominator int `json:"denominator"`
Percent *float64 `json:"percent"`
}
type RateBreakdown struct {
Covered int `json:"covered"`
Uncovered int `json:"uncovered"`
Partial int `json:"partial"`
Pending int `json:"pending"`
Unassessed int `json:"unassessed"`
Excluded int `json:"excluded"`
Stale int `json:"stale"`
CoveredCorrect int `json:"covered_correct"`
CoveredIncorrect int `json:"covered_incorrect"`
CoveredPending int `json:"covered_pending"`
CoveredUnassessed int `json:"covered_unassessed"`
}
type Rates struct {
PolicyVersion string `json:"policy_version"`
Coverage Rate `json:"coverage"`
Correctness Rate `json:"correctness"`
Breakdown RateBreakdown `json:"breakdown"`
}
func ComputeRates(views map[string]View) Rates {
out := Rates{PolicyVersion: "quality-rates-human-first-v1"}
b := &out.Breakdown
for _, v := range views {
if v.State == "stale" {
b.Stale++
continue
}
switch v.Effective.Coverage {
case "covered":
b.Covered++
switch v.Effective.Correctness {
case "correct":
b.CoveredCorrect++
case "incorrect":
b.CoveredIncorrect++
case "pending":
b.CoveredPending++
default:
b.CoveredUnassessed++
}
case "uncovered":
b.Uncovered++
case "partial":
b.Partial++
case "pending":
b.Pending++
case "excluded":
b.Excluded++
default:
b.Unassessed++
}
}
out.Coverage = makeRate(b.Covered, b.Covered+b.Uncovered+b.Partial)
out.Correctness = makeRate(b.CoveredCorrect, b.CoveredCorrect+b.CoveredIncorrect)
return out
}
func makeRate(numerator, denominator int) Rate {
r := Rate{Numerator: numerator, Denominator: denominator}
if denominator > 0 {
p := 100 * float64(numerator) / float64(denominator)
r.Percent = &p
}
return r
}