CC 评审结论(L3 §11–13)
总评
§11–13 结构完整、与 L2 §15.3 逐行可对、与四状态不变量自洽、边界守得克制(阈值留下游)。但 2 条必修:把代码中不存在 / 单字段承载的状态与能力当成现状冻结了。
必修 blocking
- B1 §11.2「重复丢弃」与「处理失败」非两终态:
internal/consts/raw_news_consts.go仅RawNewsStatusFailed=3;standardize.go去重命中与抽取失败都走markFailed→status=3,靠last_err的duplicate:前缀区分。图画成两 first-class 终态、未对「定义层 2 态 ↔ 代码 1 字段+前缀」落差留痕,违背 §11 节首自定纪律,误导 §15 存储建模。→ §11.2 补一句留痕(是否拆独立状态/字段留 §27)。 - B2 §13「推送失败重试」与代码不符:
push_message_job.go失败直接markLogStatusFull(...,2,...),全程不读不自增 RetryCount;push_log_model.go:122 FindPending查status=0 and retry_count<3,失败转 2 后永不再取 →retry_count<3是死代码,无重试闭环。§13「现行推送有重试」把不存在能力当现状冻结,会漏登缺口、误导 ADR-候选-04。→ 改「现行失败即置失败状态、无重试自增(过滤器形同虚设、是缺口)」,重试标待补,登 §22/ADR-04。
建议 non-blocking
- N1 §11.1 Source:
crawler_sources_consts.go仅 启用/停用(1/2);降级/死源/退役为目标态。建议补留痕(同 §11.2),§11.1 现缺。 - N2 §13「翻译失败 有限重试」无代码支撑:
standardize.go翻译失败仅 logx 后继续、不重试不阻塞;「重试一次」只针对 LLM JSON 解析。→ 改「失败记日志、继续(单侧语言缺失),不重试」,重试若为目标标待补。 - N3 低置信无中间态:
RawNewsStatus只有 0/1/2/3,无「低置信」;矫正目标「低置信质量标记」须落独立字段而非复用 status,§13/§11.2 点一句,防工程包硬塞 status。 - N4 §13「去重不可用退化为规则去重」无兜底:
standardize.go checkDuplicate在 weaviateClient==nil 时直接返回 ""(视为不重复、全放行),无规则去重。→ 标「待补降级」,现实为静默跳过全放行,与「去重不静默吞」精神相悖,§24 风险候选。 - N5 §12「两任务都完成才置已分发,避免半完成态」偏乐观:
raw_news_job.gowg.Wait() 后无论 task 是否出错都 UpdateStatus(Dispatched),panic 被 recover 吞、错误仅日志。「都完成」≠「都成功」。→ 改「两任务返回后置已分发(task 内失败不阻断、留日志,与不静默丢需工程包对齐)」;关联 CLAUDE.md「错误必须返回」规则张力。
亮点
- §11 五状态机与 L2 §15.3 逐行可对、四状态不变量每图有对应句,B 维无丢失。
- §11.6 主动挂「待 §15 协调点」(运行证据 vs 下游反馈),承接钩专业。
- §13 节末 + §12 明确阈值/熔断/调度参数留实施方案,D 维守得好(未冻结 MaxRetryCount/DedupCertainty/@every 1s)。
- §12 对 cron SkipIfStillRunning / 表状态轮询 / RawNewsJob 内并发 / Weaviate 去重的描述与实际代码吻合,频率标观察值准确。
- DH 语义纯净,无 FinBayes 残留。
核验文件:raw_news_consts.go、standardize.go、push_message_job.go、push_log_model.go:122、raw_news_job.go、cron_manager.go、crawler_sources_consts.go。