# 597084 统一修复代码交付报告

本轮交付一份统一code树及fix.patch，覆盖固定清单17项正式问题和2项条件边界。原分析快照未修改；未推送、未部署、未联系外部用户。

当前交付状态是“代码已接线、可审阅、部分隔离行为验证”，不是业务环境已修复。初轮R1-R5及后续来源恢复/Redis往返问题已统一修正，最终独立复审规格PASS、质量PASS（仅代码与本轮设计层面）。

## 修改内容及原因

- 人工草稿隔离：音频补发布和补录恢复都有独立发布入口，共用已有实体锁；锁内重读当前状态，不因hasPublished=1发布人工草稿。
- 音频生命周期：总超时覆盖query异常、completed下载失败等所有分支；failed/cancelled/timeout累计失败次数，submit成功不再清计数；三表按持久游标越过前页失败候选。
- 音频完整性及缓存：回填同SQL重算completeness，回填结果与教研缓存失效/受控正式补发布待办同JY事务提交。
- 分词身份与并发：首次发布先保留JY身份再映射PROD INIT，缺行全量恢复复用同一服务；保存主体事务仅登记事件，提交后独立事务失信旧结果；分词同库事务锁真实题目行并重读，跨内容位写删/空集合删除在同一题级并发门内。
- 导入安全：CSV未闭引号或非法引号位置整文件拒绝，非法variant整行拒绝；导入和批量发布显式limit均严格正数，仅省略表示全量。
- 词典一致性：POS存规范串，管理搜索与保存共用归一化；补录先幂等再查百度；数字切词，保留内部撇号/hyphen；可识别IPA排除且and/or保留。
- 可恢复缓存失效：新增有界VARCHAR outbox表及完整DAO/Core/Biz/Job，PROD发布事务内保留失效身份；按到期时间同步送broker并记录回执，失败退避重放；短语索引版本推进失败不吞掉。内部返回cacheInvalidationPending，HTTP保持Boolean并定义为PROD已提交、缓存失效待办已持久化；批量以部分成功日志说明。
- 索引条件边界：读取可降级旧快照，持久化必须拿到与远端版本一致的写句柄，未知或无法确认则跳过写入。

逐项代码位置、完整关键方法、机制解释及材料契约替换文案见FIX-LOGIC.md；机器可读清单见coverage.json。没有拆成多个独立小补丁。

## 实际验证

- 十组隔离探针保留RED和GREEN证据，详见verification/red-*.txt与green-*.txt。执行的是生产完整Reader/Task/Words，或逐字提取的生产Param/handleInFlight；外围框架和外部依赖为替身。
- 当前Java AST语法检查通过；它不解析整个项目的类型依赖，不能替代编译。
- 根实现者生成统一补丁并对固定基线副本运行git apply --check，结果见patch-check.json。
- 交付9份新增JUnit；未运行Maven、完整工程编译或JUnit，没有覆盖率实测。

## 未验证与必须说明的集成前提

- outbox、资格列及输出来源三份DDL须在JY/PROD都先部署；注册XXL-Job englishDictOutboxReplay与englishSegmentOutputIdentityRecover每分钟持续运行，使用现有租户任务上下文。不落实这两项，不能说缓存恢复机制已运行。
- broker确认只证明投递受理；消费者失效成功、重试/DLQ、多实例索引换表仍须业务环境验证。
- 9份受影响的原有Mockito fixture已实际迁移到code/，本包新Revision fixture也更新；JUnit未运行，不声称旧suite通过。VERIFICATION.md列出具体变化。
- 题目DB锁覆盖计算和写删，增加该题更新等待；保存事务内只有事件登记，派生失信在提交后独立执行，失败不回滚主体。下发绑定本次RPC已选输出的生成输入hash/完整输出hash及本库form/config身份，缺凭据只丢segments；不再额外读当前正文冒认响应来源。生成/重算新增身份校验需验证成本与并发锁等待。
- 未标记的纯ASCII音标与普通英语不能可靠区分，本次没有声称全量IPA识别。
- 未实跑MySQL UPDATE/成对ID、多库事务路由、Redis失败次数/游标、TTS提交下载、管理页/RPC实际下发。

## 设计建议的边界

FIX-LOGIC.md提供Spec17草稿补发布、分词发布骨架、最新PRD联合查重/撇号、音频mp3/wav门槛、百度降级语义、索引fail-open边界的具体替换文案。这些是根据本次明确设计给出的统一建议，未冒称外部文档已经改写或负责人已经确认。

本次没有新建CodeGraph索引，不涉及临时索引清理；没有新增无关业务规则。

## fix-round1修正记录

- R1：锁题SQL改为真实旧表del_flag，并交付列契约RED/GREEN。
- R2：提交前不读写派生表；AFTER_COMMIT独立失信异常被隔离，仍投计算消息。
- R3：计算Tx先退出回滚释放锁，外层再独立事务重锁当前题目，核revision和可用内容指纹后登记FAILED。实际Spring拦截器探针确认回滚先于失败登记提交。
- R4第一轮仅当前DB正文指纹门不足以证明实际响应来源，已被第二轮生成时来源绑定替换，详见下节。
- R5：新增auto_publish_eligible，新补录置1，人工save清0，实体锁内按flag检查；存量迁移默认0，来源source不变。
- 7份原fixture和本包Revision fixture实际迁移；内部BatchPublishResultBo新增pendingCacheCount，Job日志说明PROD已提交而缓存待确认；HTTP Boolean保持既有契约。

修复前树保留review-baseline/，用于统一fix-wave.patch，最终发布应用仍以完整fix.patch为准，不拆交付包。

## fix-round2实际响应来源绑定

- 新增生成前原输入hash、完整输出JSON hash、本库formDataId/configId绑定。动态输出schema不按FormData shape猜解析；响应路径不下载JSON。
- RPC在选择contentConfigBo URL的同一位置固定不可变SelectedSegmentOutput，并把请求局部map传入fillSegments；库存凭据全部一致才下发。v1已选响应即使DB和分词后来都变v2，也保持segments=null；同v2正常。
- 新增第三份双库DDL（OutputData的VARCHAR40输入hash）、完整缓存装配与显式SQL投影、原BO六参兼容。分词来源字段只占少量原JSON空间，仍严格3000上限并走FAILED。
- 新增必须持续运行的来源恢复Job englishSegmentOutputIdentityRecover，真实调用原生成服务、上传输出、登记可靠缓存驱逐、再重算。必须部署并持续启用，会写OSS/DB；本次没有运行。旧缓存缺可靠身份安全省略，禁止现场补新DB hash到旧URL；三份DDL和两个Job均为前置。
- 最终10组probe对冻结code重新执行全部exit0，见verification/final-probe-runs.json；response-binding RED退出1，GREEN8断言通过。当前AST72 Java无语法错。没有Maven、完整编译或JUnit业务验收。
- 多配置选择与每题/内容位单行库存的边界已在FIX-LOGIC明确，身份不一致时省略，不虚报多配置全覆盖。

最终独立复审规格PASS、质量PASS，见REVIEW-FINAL.md；该结论不代表完整工程编译、JUnit或业务验收。初轮记录全部保留。

## fix-round3：Redis往返与持续恢复

真实BO/default serializer RED已证实嵌套null丢失会破坏现场重算的输出hash；现改为loadDB从同一输出行预计算scalar，Redis往返仍一致，旧缺scalar拒绝。两个实际装配入口、capture、回归fixture均同步。来源恢复Job及Service总开关/执行急停在取锁与写OSS前生效，真实Job探针暂停零锁零服务调用，正常对照放行。

来源恢复者必须持续每分钟调度，不是一次迁移工具。每库每轮50，N候选完整圈按ceil(N/50)+1个成功调度轮加执行时间保守估算；锁跳过/暂停/故障/重试不能给无条件墙钟上界，不能承诺发布一分钟或秒级全部恢复。完整圈日志和持久游标保留。

最终10组probe已对冻结代码重跑全部exit0；72 Java AST无语法错。真实MySQL、OSS生成、双库Job、MQ消费、完整工程/JUnit仍未运行。每项准确代码位置、部署依赖及证据见coverage.json，供改动矩阵逐项使用。

最终复审已通过：REVIEW-FINAL.md。17正式+2条件的代码/设计覆盖通过审查，运行边界仍按VERIFICATION.md保留。
