{
  "head": "0baa9ebe8b7f9ecc46f675acbf1f56ac65378957",
  "findings": [
    {
      "id": "SEG01",
      "p": 2,
      "title": "首次发布早于异步分词完成时，正式库缺行不能由全量自行恢复",
      "file": "application/src/main/java/cn/jojo/cc/biz/service/impl/question/library/QuestionBizServiceImpl.java",
      "start": 2099,
      "end": 2102,
      "trigger": "首次同步后立即发布；worker尚未完成或首次计算失败，JY无NORMAL行",
      "mechanism": "buildPublishableSegments空/非成功即返回空，ensureProdSegmentSkeletons直接return；发布MQ随后refreshQuestion见PROD无行直接false；每日force也共用该缺行门。JY次日成功不自动再次发布。",
      "impact": "学生库永久segments=null直到人工再次发布；不是承诺的次日全量收敛",
      "counter_evidence": "JY正常行已就绪后发布可建INIT骨架并计算成功；再次发布可恢复",
      "kind": "新异步窗口与骨架策略扩大可达；历史发布缺行亦无全量补建",
      "validation_boundary": "静态完整闭环，未实跑MQ/DB"
    },
    {
      "id": "SEG02",
      "p": 2,
      "title": "正文更新后到异步执行前旧NORMAL序列仍可下发",
      "file": "application/src/main/java/cn/jojo/cc/biz/service/english/segment/QuestionSegmentSaveHookService.java",
      "start": 85,
      "end": 94,
      "trigger": "已有成功分词；LABS同步正文增加/删除英文；暂停计算消费者或投递失败",
      "mechanism": "AFTER_COMMIT只发ID消息，提交时未把旧行置INIT/FAILED；delivery只验NORMAL而不比题目正文/revision。worker尚未到引擎时，旧成功行被视为可信。正式库重新发布也保留已有骨架行，不降级。",
      "impact": "新正文搭配旧序列，按顺序定位可漏高亮/错位置；消息丢失持续至下次实际重算",
      "counter_evidence": "worker成功会覆盖，已进入引擎失败会markFailed；不能把正常秒级受理当同步完成",
      "kind": "同步计算改MQ后新增明显窗口；发布保留现存行同类窗口",
      "validation_boundary": "静态控制流证明；没有声称真实客户端已错误高亮"
    },
    {
      "id": "SEG03",
      "p": 2,
      "title": "迟到旧任务删除新revision另一内容位成功行",
      "file": "application/src/main/java/cn/jojo/cc/biz/service/english/segment/QuestionSegmentBizServiceImpl.java",
      "start": 406,
      "end": 415,
      "trigger": "历史兜底MATERIAL→新表单ANSWER_AREA；旧刷新读旧正文后暂停，新同步rev2成功，再恢复旧rev1",
      "mechanism": "upsert/isStale仅保护同(question_id,content_type)；旧type1写入可成功；dropObsoleteContentTypes重读当前type2后按ID软删，无revision条件",
      "impact": "新type2成功结果被旧type1替代；下发拿到旧内容序列",
      "counter_evidence": "稳定题型固定同内容位时旧revision SQL门有效；需内容位集合变化，不是所有乱序均触发",
      "kind": "旧21保留，当前代码未修",
      "validation_boundary": "静态SQL与方法完整核对；未本轮DB并发实跑"
    },
    {
      "id": "SEG04",
      "p": 2,
      "title": "数字夹英文仍作为整词查询",
      "file": "common/src/main/java/cn/jojo/cc/common/utils/EnglishWords.java",
      "start": 31,
      "end": 32,
      "trigger": "cat2dog、3look up4",
      "mechanism": "isWordChar包含数字，nextToken连续吞入，isWordToken只要求至少一个英文字母",
      "impact": "与Spec7.3数字分隔冲突，漏cat/dog且可能补录cat2dog等混合词",
      "counter_evidence": "纯1972过滤正确，low-temperature整词正确",
      "kind": "旧15保留",
      "validation_boundary": "本轮原EnglishWords+TextNormalizer隔离javac通过并执行，cat2dog/3look/up4输出已确认"
    },
    {
      "id": "SEG05",
      "p": 2,
      "title": "IPA仅移除扩展字符仍遗留ASCII音标碎片",
      "file": "application/src/main/java/cn/jojo/cc/biz/service/english/segment/DefaultSegmentTextExtractor.java",
      "start": 133,
      "end": 134,
      "trigger": "富文本含word ˈfəʊnəm good等无斜杠音标",
      "mechanism": "正则仅清IPA Unicode区间，f/n/m等ASCII被当正文留下",
      "impact": "碎片参与匹配与补录；PRD音标不处理未完整达成",
      "counter_evidence": "无语义标记的全ASCII音标与普通单词不可无损区分；禁止恢复成对斜杠删除以免误删and/or",
      "kind": "旧16保留；Spec当前明确仅IPA字符区间，需产品与结构策略裁决",
      "validation_boundary": "本轮静态复核；旧探针只作线索，未宣称本轮实跑Jsoup"
    }
  ],
  "fixed": [
    {
      "previous_id": "18",
      "result": "作答区对象textAnswerAreaContent与数组classifyName已正确分支，填空/输入/完形不再读取determineInfo。"
    },
    {
      "previous_id": "22",
      "result": "refreshAll与refreshOneInProd同时检查总开关和执行闸门。"
    }
  ]
}