Files
LWLT-AIBOT/progress.md
2026-08-25 10:33:29 +08:00

224 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目进度
## 2026-08-24 — ERP 异常状态链接刷新加固(已完成)
- 已按治理规则读取 README、活动 planning 文件并运行 `git status --short`;工作区存在大量既有改动,均保留不回退。
- 已通过 `business-adaptation-registry.md` 确认本轮属于插件宿主维护能力;已核对 lifecycle mapping、`background.js`、`business-bridge.js`、popup 和 `tools/erp-session-keepalive.test.mjs`。
- 已确认当前保活只做定时只读探测:异常后不刷新现有 ERP 链接,且没有“恢复后二次探测”的状态闭环;下一步实现受控恢复并补回归。
- 已实现异常恢复单飞锁、2 分钟冷却、现有 allowlisted ERP 标签页绕缓存刷新、加载完成后的只读复测,以及恢复状态持久化;执行中任务、关闭开关、无现有标签页和权限异常均保持跳过/失败关闭。
- 平台状态新增 ERP 会话和链接恢复告警;异常或恢复中不领取新任务,业务 operation/Schema/Skill 未扩展。
- 定向验证:background/popup/platform/inpage/team-batch 语法通过;保活回归 4/4、生命周期契约 47/47;已生成 `dist/ltjt-order-assistant-0.5.140.zip`,SHA-256 为 `5d2eceb77a337849bd20bc3e03dea4c86b617c789dd196b8a47bbb33c0da0338`,旧包已归档。
- 完整门禁通过:`check:repo` 9/9、`check`、串行 `test:control-plane` 66/66、`test:legacy` 214/214、`build`、`git diff --check`;并行首轮控制面测试的 50ms listener 断言波动已通过串行复跑确认不是本次改动回归。
- 本轮未执行真实 ERP 写入、任务重试、重启、部署或外部发送;当前未提交改动及其他既有工作区改动均保留。
## 2026-08-22 — 取消产品/客户来源地强制匹配(已完成)
- 已从用户日志确认阻断来自 `product_customer_source_region`,产品“贵阳八天”与客户来源信息不一致;任务在 ERP 写入前停止。
- 已移除散拼子单、散拼母团可选客户、独立团单/批量下单的产品/客户来源地兼容阻断,并移除产品参与客户候选消歧;产品和客户仍分别要求唯一 ERP 候选,客户自身来源词 fallback 保留。
- 已同步业务页、mapping、生命周期夹具、扩展说明、控制面测试和静态契约;扩展/平台/mapping 版本为 `0.5.139`,旧 ZIP 已归档,新 ZIP 哈希见 `findings.md`。
- 定向语法、产品/客户解析、生命周期契约和 AgentBus 测试通过;完整验证 `check:repo` 9/9、`check`、控制面 66/66、legacy 213/213、`build`、`git diff --check` 全部通过。未重试任务、未写 ERP、未重启、未部署、未外发。
## 2026-08-20 — AgentBus 通讯测试(已完成)
- 面板 PID `74544` 仍监听 `127.0.0.1:8786`;`/health/ready`、`/api/status` 通过,数据库、Schema、迁移和 4 个 AgentBus 渠道均 `connected=true`、`session_ready=true`。
- 重启后日志确认 4 次 WebSocket 握手、4 次 `session.ready`、1 次入站消息受理、2 次出站回执发送;无 `socket_close` 或本地出站失败。未主动发送新的测试消息。
- 上游返回 2 个 `type=error` 帧,当前监听器按协议将非 `event` 帧忽略;不影响连接状态,但如需确认远端渠道最终收件,还应结合 AgentBus 服务端回执核对。
## 2026-08-20 — ERP 会话待机保活(已完成)
- 已确认当前扩展只有任务执行期间保活;已按业务登记、`lwlt-confirmation` Skill/契约、生命周期 mapping 和现有宿主实现核对,待机保活属于插件维护能力,不属于业务 operation。
- 已实现 `chrome.alarms` 定时调度:首次约 1 分钟、之后每 5 分钟;仅对现存 allowlisted ERP 标签页发起带 Cookie 的 `GET /System/Mainlt.asp`,不刷新页面、不新开标签、不执行 ERP 写入。
- 已增加执行中跳过、automation/独立保活开关、登录/权限响应识别、本地最近状态记录、桥接回传和 popup 状态展示;浏览器/系统休眠延迟属于明确边界。
- 定向语法与回归已通过:background/business-bridge/popup `node --check`,ERP 保活测试 3/3,生命周期契约 50/50;已生成 `dist/ltjt-order-assistant-0.5.138.zip`,SHA-256 为 `751dfe6022d61c7388c602089c703b88a9bfeebf67f81edacea1555545d7bcd0`。
- 项目规定验证通过:`check:repo` 9/9、`check`、控制面 66/66、legacy 218/218、`build`、`git diff --check`;未进行真实 ERP 登录/写入、任务重试、外部发送、重启或部署。
## 2026-08-19 — AgentBus 无状态消息但任务成功(进行中)
- 已读取 README、活动 planning 文件并运行 `git status --short`;既有工作区改动全部保留。
- 已选择只读诊断范围:AgentBus 契约、`confirmation_export` 业务登记、任务事件、消息路由、渠道 listener、outbox 和回归测试。
- 已确认对外契约只定义 accepted 与最终 result,不定义 processing;生产数据库渠道先持久化 accepted,再在 accepted 送达且任务终态后入队 result。
- 已确认成功任务与 AgentBus 回执解耦:手工来源或缺少 `channel_id`/入站 frame 路由时,任务照常可完成但不会写入 AgentBus delivery;连接/`session.ready` 不可用时,delivery 留在 pending/failed 等待重试。
- 已确认执行结果提交只写任务与内部生命周期事件;AgentBus 的 result 在 listener 后置 flush 中生成,故需同时检查任务终态和 `agentbus_deliveries`/`outbound_*` 日志。
- 已完成源码、契约、迁移和回归测试核对:processing 不发送;accepted 依赖入站路由与渠道 outbox;result 依赖 accepted 已送达且任务终态。
- 当前 `/health/ready` 只读检查通过,4 个 AgentBus 渠道均已连接并 session-ready;未取得用户所指历史任务 ID,因此保留历史归因边界。
- 验证通过:`check:repo` 9/9、`check`、`test:control-plane` 66/66、`test:legacy` 215/215、`build`、`git diff --check`。
- 本轮未修改业务源码、未重试任务、未发送外部消息、未重启或部署。
- 用户补发任务后从 `/private/tmp/lwltAPI-dev.stdout.log` 定位到 `TASK-20260819102429-R13bn8w`;accepted/result 均已由控制面写出并收到 AgentBus server 的 accepted/delivered 回执,未见本地发送错误。
- 诊断结论更新:问题不在任务执行成功与否,也不在控制面 outbox/WS 发出阶段;需由 AgentBus 网关/微信适配器检查下游展示。未向该下游主动发送测试消息。
## 2026-08-19 — confirmation_export Chrome host 权限阻断(已完成)
- 已确认两份日志均为同一主机权限失败:外部解析和 operation 契约成功,浏览器执行阻断,`no_erp_write=true`。
- 已在 `background.js` 增加 host permission 前检、批准 ERP origin 复核、同源导航竞态重试和 fail-closed 诊断码;`readErpSessionStatus()` 会暴露 `host_permission_granted`,平台页面会显示并据此阻止新的 handoff。
- 已新增生命周期静态回归,覆盖 manifest host、注入封装、错误码和平台权限门禁;定向语法检查、operation plan 40/40、生命周期契约 47/47 通过。
- 扩展已递增到 `0.5.137`,同步 `inpage.js`、`team-batch-inpage.js`、平台最低版本、mapping、README 和版本断言;已生成 ZIP/发布清单。
- 已将旧 `0.5.136` ZIP 归档,生成 `dist/ltjt-order-assistant-0.5.137.zip`,SHA-256 为 `6c00c6e8240fad80bc8fbe8e932dfaf22ad32e494c957717c2d7537785f09fd5`;`check:repo` 9/9 确认发布清单、版本、哈希和扩展源码逐文件一致。
- 完整验证通过:`check`、控制面 66/66、legacy 215/215、`build`、`git diff --check`;定向 operation plan 40/40、生命周期契约 47/47。
- 本轮没有重试用户任务、写入 ERP、发送外部消息、重启或部署;由于固定 ERP URL 的只读网络探测超时,未宣称 live 浏览器复测成功。
## 2026-08-18 — visitor-list XLSX 转换失败排查(进行中)
- 用户确认继续排查并修复附件日志中的 `visitor_xlsx_conversion_failed:conversion_failed`。
- 已确认 Agent 解析成功、ERP 只读读取发生且 `no_erp_write=true`;最终任务被阻断,原始 XLS 未向 AgentBus 外发。
- 下一步:用脱敏 HTML-in-XLS fixture 复核转换器和运行环境,定位具体失败点后补修复与回归验证。
- 首次复现脚本因 Node 24 的 ESM/CommonJS 混用在转换前退出,已记录;下一次改用纯 ESM 脚本。
- 用当前 bundled `soffice` 重跑后复现真实失败:HTML 输入按 Writer/Web 加载,Calc XLSX 导出触发 `SIGABRT`;下一步比较保留 `.xls` 导入与中间格式路径。
- 已确认保留 `.xls` 扩展名即可让 LibreOffice 按 Calc 文档导入并成功输出真实 XLSX;`convertDocumentToXlsx()` 已修正,定向转换器测试 6/6 通过,真实 bundled LibreOffice fixture 生成 6,114 字节 ZIP/XLSX。
- 完整门禁通过:`check:repo` 9/9、类型检查、控制面 66/66、legacy 214/214、build、`git diff --check`;随后已优雅重启面板,新实例 PID `24717`,`/health/live` 与 `/health/ready` 通过,4 个 AgentBus 渠道均 `connected=true`、`session_ready=true`。未触发 ERP 重试或写入。
## 2026-08-18 — 散拼母团创建写后回查假阴性修复(已完成)
- 用户已确认本次 2027 年计划实际创建成功,并明确要求开始修复。
- 已定位确定性恢复缺口:完整返回团号时即使精确列表回查全空,也不会进入按日期兜底;精确查询还未显式清空其他列表筛选。
- 实施边界为纯写后只读恢复:清空筛选、有限延迟重试、失败即按日期兜底;不执行真实 ERP 写入、任务重试、重启或部署。
- 已在 `split-plan-reconciliation.js` 增加完整筛选值构造、返回团号有限重查、恢复触发判定和回查行合并纯函数;尚未接入页面执行函数。
- 已接入 `createSplitParentLive()`:精确团号查询显式清空非目标筛选并按 `0/750/2000ms` 有限重查;任一团号持续未命中、响应异常、数量不符或事实探针启用时均进入逐日期兜底。恢复路径只调用列表查询,不再次调用保存。
- 已补充纯函数行为测试和生命周期静态门禁,覆盖首次全空、第二次可见、完整团号仍需兜底、回查行优先合并,以及创建函数只保留一次保存捕获调用。
- 定向测试通过:`tools/split-plan-reconciliation.test.mjs` 14/14,生命周期回查门禁 1/1;两个修改后的插件脚本语法检查通过。
- 扩展源码、manifest、平台最低版本、生命周期 mapping、散拼计划 mapping、README 与版本断言已同步递增到 `0.5.135`;版本化 ZIP 和发布清单待生成。
- 已核对旧 `0.5.134` ZIP 的 SHA-256 与当前发布清单一致,并将其移动到 `archive/releases/2026-08-18/`;可从归档恢复。
- 首次打包因相对路径多退一级而未创建任何 ZIP;已记录错误,下一次使用扩展目录到项目 `dist/` 的正确 `../../dist` 路径。
- 已生成并逐文件核对 `dist/ltjt-order-assistant-0.5.135.zip`,压缩测试无错误,SHA-256 为 `9f49f5529083cb1cc497bfc52c56d0142076394c034552fcdd77e34e70ce7f14`;发布清单已同步。
- `check:repo` 9/9 通过,确认发布清单哈希、版本化 ZIP 与当前扩展源码逐文件一致。
- 完整验证首次运行:`check:repo` 与 `check` 通过;控制面 60/61,唯一失败为当前工作区的游客名单 `.xlsx` 转换测试桩未生成输出,后续 legacy/build 因 `set -e` 尚未运行。本次回查相关定向测试不受影响。
- 单独继续验证时 legacy 213/214;唯一失败是本次版本递增遗漏的一处转义正则仍断言 `0.5.134`。构建因 `set -e` 尚未执行,待修正版本断言后重跑。
- 已修正全部版本断言并重跑:legacy 214/214、build、`git diff --check` 通过。本次散拼回查修复验证完成。
- 控制面保持 60/61:唯一失败为本任务开始前已有的游客 XLSX 并行改动测试桩只生成 PDF、而当前转换器要求 XLSX;为避免越权改变未确认的游客交付策略,本轮保留该既有改动并明确记录。
- 最终复核中 `check:repo` 9/9 与 `git diff --check` 已通过;后续哈希命令因子 shell 未继承 bundled Node PATH 中止,改用绝对 Node 路径补跑。
- 使用 bundled Node 绝对路径补跑哈希复核通过:ZIP 与发布清单均为 `9f49f5529083cb1cc497bfc52c56d0142076394c034552fcdd77e34e70ce7f14`;最终 `git diff --check` 通过。
- 用户明确授权后已重启控制面:旧服务进程组优雅退出,自动恢复出的新实例 PID 4554 独占 `127.0.0.1:8786`;live/ready、数据库、Schema、迁移与 4 个 AgentBus 渠道均正常。竞争拉起实例因端口占用安全退出,未触发任何 ERP 任务重试。
## 2026-08-18 — visitor-list AgentBus XLSX 交付(已完成)
- 已确认 ERP `Visitor.xls` 是 HTML-in-XLS 伪 Excel:桌面 Excel 可兼容打开,手机/微信通常不支持;插件、控制面和 OSS 均保持源字节,未发现传输损坏。
- 用户确认“原始 `.xls` 保留在平台归档 + 生成真实 `.xlsx`”,并明确 AgentBus 返回 `.xlsx`。
- `document-converter.ts` 新增真实 XLSX 转换和 ZIP magic/大小校验;`task-service.ts` 为 visitor-list 保存源 XLS 与派生 XLSX,其他类型继续 PDF/源文件回退。
- AgentBus 直连、耐久 outbox 和统一用户回执均按 `agentbus_visible` 过滤,转换失败 fail-closed,不回传原始 XLS。
- 已同步 Skill、输出契约、AgentBus 契约、Schema、mapping、平台/扩展提示、测试夹具和运营模板;未写入 ERP、未重试、未重启或部署。
- 表格结构已通过 artifact-tool 导入/检查/渲染验证;定向控制面回归 66/66 通过。
- 最终门禁已通过:`check:repo` 9/9、`check`、`test:control-plane` 66/66、`test:legacy` 214/214、`build`、`git diff --check`;Skill 校验通过,运营 DOCX 15 页渲染通过。
## 2026-08-18 — 三次团队文件导出同错诊断(已完成)
- 用户指出同一导出模块包含多个内容;已查看截图并转入逐类型只读核查,本轮不实施原文件策略。
- 截图可见 9 个 ERP 导出按钮;契约定义 10 种 canonical type,将继续对照路由、文件名/MIME 和历史源文件证据。
- 已确认 10 种导出内容共用一个 `confirmation_export` action;截图中的 `JOB Order`/游客信息/大交通预订单与契约中的中文名称存在同义命名。
- 已读取 `exportConfirmationSources()`:10 种类型各自请求 ERP 原生 URL,保留原响应元数据,插件固定标记 `converted=false`;待继续从历史证据确认各类型的实际文件扩展名。
- 已读取历史全类型源读取证据:10 种类型的原生响应包含 Word 附件、Excel/HTML 响应和 HTML 打印页,四轮均为 10/10 HTTP 200;归档未保留全部文件名,但保留了字节/SHA-256。
- 已确认插件内 `normalizeExportType` 不直接映射截图中的部分中文/界面别名,下一步核对外部 Agent 解析层与测试覆盖,避免把“按钮名称”误判为 canonical type。
- 已核对外部 Agent 校验与测试:`confirmation.type`/`export_types` 只接受 10 个 canonical 字符串,现有 Skill/测试未直接覆盖截图的 `JOB Order`、`游客信息`、`大交通预订单` 文案;该别名覆盖缺口与 PDF/原文件策略相互独立。
- 已定位并记录逐类型 ERP 路由、源响应元数据和历史格式矩阵;同时确认控制面 `prepareExecutionArtifacts()` 才是全类型统一转 PDF 的实际调用点。
- 已读取本轮 920 行日志,确认 action 为 `confirmation_export`,ERP `.xls` 源文件被转为 `.pdf` 后成功交付。
- 已确认用户的新要求是仅 `visitor-list`(游客信息)保留 ERP 源 XLS 并生成真实 XLSX,AgentBus/微信只交付 XLSX,其余 9 类继续转 PDF;已完成实现与回归。
- 已定位最小实现点:控制面 `prepareExecutionArtifacts()` 按 artifact type 选择转换;转换器、插件源读取、存储和下载链路均保留。
- 已完成控制面双文件交付:`visitor-list` 保留源 XLS 归档并生成真实 XLSX,其他类型沿用 PDF/失败回退;同步契约、过滤和测试均已验证。
- 已同步控制面、Skill、业务登记、输出契约、mapping、Schema、插件提示、发布门槛和测试;选择性转换回归测试通过,运营 DOCX 已重建并完成 15 页渲染检查。
- 首轮全量验证发现的两个同步项已收敛:0.5.134 扩展 ZIP 已按当前源码重打并逐文件核对,operation-plans 提示断言已同步;控制面测试 61/61 已通过。
- 最终验证通过:`check:repo` 9/9、`check`、控制面 61/61、legacy 208/208、`build`、`git diff --check`;`lwlt-confirmation` Skill 官方校验通过,DOCX 15 页渲染检查通过。未执行 ERP 写入、重试、重启或部署。
- 新增诊断与实施已完成:`Visitor.xls` 是 ERP 返回的 HTML-in-XLS 伪 Excel,native 分支与 OSS 链路保持原字节;平台现在生成真实 XLSX,移动端/微信通过 AgentBus 只收到 XLSX。
- 已通过业务登记和 Skill 确认当前 PDF 规则是 action 级全局默认,不是本次 `.xls` 的特例。
- 已核对 Schema、mapping、插件源文件契约、控制面 artifact 准备/保存、平台下载、AgentBus 附件回传、Skill 包和运营 DOCX 的影响面。
- 用户已确认共享理解;本轮已修改业务实现并完成本地验证,未部署或重启。
- 已读取三份日志并确认它们是独立运行但具有相同失败签名。
- 共同失败发生在 `confirmation_export` 的浏览器来源解析:`row_count=0`、`child_link_count=0`,尽管响应存在 `ddid/tid`;插件按安全门禁阻断。
- 三次均未写入 ERP;下一步对比各自查询条件和当前适配器实现。
- 第一份任务已确认前置唯一解析成功,失败集中在随后按母团/日期加载来源页面后的行与子单链接识别。
- 已通过业务登记定位到 `lwlt-confirmation` / `confirmation_export`,开始核对该业务页、Skill、Schema、mapping 和插件实现。
- 已完整读取 `lwlt-confirmation` 主 Skill;Agent 侧职责与日志中的成功解析一致,继续检查输入/输出契约及插件二次查询。
- 已核对输入/输出契约、执行态 Schema 和生命周期 mapping;三份日志里的执行态引用满足契约,故障定位进一步收敛到散拼母团查询响应中的子单叶子行解析。
- 已读取 `exportConfirmationSources()` 与唯一解析辅助函数:错误中的 `ddid/tid=true` 只是已解析引用兜底;二次查询现场连母团行也为零。正在核对强制“收客中”过滤与母团子单展开逻辑。
- 已定位历史散拼子单导出证据集,准备对比成功运行的 preflight/查询字段与当前三次失败。
- 已排除把生成清单的 `ok=true` 误当成 ERP 浏览器成功;继续从 replay state 和证据登记提取真实执行结果。
- 已确认旧基线存在两轮散拼子单导出真实成功证据(各运行合计 40/40、失败 0);下一步对比当前工作树与旧实现/查询条件,识别回归点。
- Git 提交历史不足以定位细粒度变更,已改用归档版本化扩展 ZIP 做逐版本函数对比。
- 0.5.84 已包含当前类型的严格散拼导出二次门禁,排除“0.5.133 最近才引入”这一简单解释;继续查 0.5.81 证据源码及查询状态差异。
- 已完成 0.5.84/0.5.93/0.5.118/0.5.132/0.5.133 导出函数对比:查询门禁未变,当前根因最高概率为只读导出强制 `收客中` 与目标母团实际状态冲突。
- 已确认三次都针对同一子单/母团/日期/内部引用;显式 `收客中` 通过原生菜单点击和 AJAX 真正参与查询。三次同错诊断完成,未改业务代码、未重试、未写 ERP。
- 完整本地验证通过:`check:repo` 9/9、`check`、控制面 60/60、legacy 207/207、`build`;未重启服务或部署。
- 用户已确认本轮实施:仅移除 `confirmation_export` 散拼子单二次查询的固定“收客中”过滤,继续保留母团/子单/`ddid`/`tid` 唯一核验;不触发 ERP 重试或写入。
- 已确认当前源码改动点为 `chrome-extension/ltjt-order-assistant/inpage.js` 的 `exportConfirmationSources()`,接下来补回归测试并同步扩展版本与版本化交付物。
- 已移除该函数对 `S_zhuangtai='收客中'` 的固定赋值;新增回归测试验证导出查询不携带生命周期状态过滤,同时保留母团/子单/`ddid`/`tid` 门禁。
- 扩展源码、manifest、平台最低版本、mapping 和插件 README 已递增到 `0.5.134`;版本化 ZIP 与 release manifest 待打包后更新哈希。
- 已生成并校验 `dist/ltjt-order-assistant-0.5.134.zip`,SHA-256 为 `7434d8221f8bf80a432aed64a10c4c2cf46c9160ccef5d97f86173a95102ddea`;旧 `0.5.133` 包移入 `archive/releases/2026-08-18/`,待完成全量验证。
- 完整验证通过:`check:repo` 9/9、`check`、控制面 60/60、legacy 208/208、`build`;`git diff --check` 通过。首轮直接调用 bundled Node 的 `--run` 因脚本子进程 PATH 缺失失败,显式前置 bundled Node 路径后通过。
- 最终补跑 `check:repo` 9/9 与 `git diff --check` 仍通过;本轮修复闭环完成,未触发 ERP 写入、重试、重启或部署。
## 2026-08-18 — “取消订单”外部解析超时诊断(已完成)
- 用户日志显示外部会话创建成功,但 SSE 连接后约 120 秒没有任何事件,最终为 `external_cancelled`;`event_count=0`。
- 已确认 `agent_returned=false`、未进入插件、未写入 ERP;问题发生在外部解析请求阶段,不是 ERP 订单状态或写入失败。
- 已核对客户端 abort/timeout 路径,并用 bundled Node 的挂起 SSE 探针复现:单次读流超时因 abort 竞态被归类成 `external_cancelled`。
- 已确认当前 `order_cancel` 的解析/执行契约只接收单个 `existing_refs.identifier`;用户给出的 3 个单号需要拆成 3 个独立任务,不能拼成一个标识。
- 本轮未读取 `.env`,未发送外部请求,未修改代码,未执行 ERP 写入;后续若修复错误归类或增加批量取消能力,需用户明确授权。
## 2026-08-18 — 散拼计划创建回执不确定诊断(已完成)
- 新日志的 SSE 解析正常完成(174 个事件),已进入 `shared_plan_create` 插件执行;不是外部解析超时。
- ERP 写入请求返回 HTTP 200 和“操作成功,共计新增 3 个团队”,返回团号 `LW-260107A-H`、`LW-260115A-H`、`LW-260126A-I`;已确认跨过 ERP 写入边界。
- 写后逐团号回查三个均未命中,任务安全地进入 `execution_uncertain` / `reconciliation_pending`,停止且不自动重试;当前不能判定未写入。
- 已定位当前实现:当返回团号数等于指定日期数且未启用 probe 时,不执行按日期 fallback,可能放大回查假阴性;本轮只诊断,未修改代码。
- 后续安全动作是先在 ERP 散拼团计划表逐个精确核验三个团号,并核对 2026 年 1 月日期是否符合原意;未核验前不得重新创建。
- 显式注入 workspace bundled Node PATH 后完成项目验证:`check:repo` 9/9、控制面 60/60、legacy 202/202、build 通过;首次 shell 未找到 `node` 已修正。
## 2026-08-18 — 散拼计划日期跨年归一化诊断(待策略确认)
- 已确认原始输入没有年份,运行日期为 2026-08-18;用户意图是 2027-01-01 至 2027-01-30,指定 01-07/01-15/01-26。
- 已确认错误 operation 在外部 Agent 阶段生成了 2026 年日期;插件只消费四位年份,不负责推断或纠正年份。
- 当前 Skill 与运行时提示不一致:Skill 允许“年份不确定时追问”,但宿主没有强制执行;需要确认是否改为新建业务按下一次发生日自动补年。
- 未修改代码、未对既有错误计划执行 ERP 变更;策略确认前禁止重试。
## 2026-08-18 — 散拼计划日期跨年归一化修复(已完成)
- 用户确认:新建业务无年份日期按下一次发生日补年;修改/查询保留既有 ±1 年匹配逻辑。
- `LianSyn-platform/external-agent-client.mjs` 已增加宿主侧确定性补年:只作用于四类 `lwlt-newbooking` 新建 action;明确年份和生命周期修改/查询 action 不改写;续问时合并原任务历史日期上下文。
- Agent Prompt、`lwlt-newbooking` Skill 和宿主接入文档已同步到 `ltjt-agent-prompt-v1.5-next-date-rollover` 规则。
- 定向回归测试 72/72 通过,覆盖 2027-01 跨年、当年未来日期、显式年份、修改不变和补充信息续问。
- 五个 Skill 已发布为 `0.5.119` 版本,旧 `0.5.118` 制品已移入日期归档,`dist/release-manifest.json` 已同步哈希和版本。
- 完整验证通过:`check:repo` 9/9、`check`、控制面 60/60、legacy 207/207、`build`;未执行真实 ERP 写入、部署或重试。
## 2026-08-18 — PDF 转换内容完整性修复(已完成)
- 源 `.doc` 确认为 Word 生成的 HTML;旧 PDF 缺失中文是 LibreOffice 子进程未加载字体配置造成的。
- 转换器固定使用 `writer_pdf_Export` 分页 PDF 导出,并自动加载显式、系统或随转换器捆绑的 fontconfig;失败继续回退源文件。
- 修复 Word HTML 宽表在 A4 右侧被裁切:按最大声明宽度动态缩放到可打印区域;实际附件 2 页 A4 的右边框、右栏和正文均完整。
- 控制面已重启,AgentBus 健康检查通过。
- 源文件引用的远程图片因当前 DNS 不可达无法获取,未将其误判为可恢复内容。
## 2026-08-18 — AgentBus 渠道状态同步修复(已完成)
- 修复旧控制面进程停机回写 `disabled` 覆盖新连接的问题。
- `/api/channels` 优先使用当前 listener 实时状态,启用且已握手的渠道显示 `connected`。
- 状态回写增加 session epoch 防护;listener 重载/进程关闭不再等同于管理员停用。
- 控制面测试 59/59、类型检查、build、`git diff --check` 通过。
- 重启后 3 个启用渠道均为 `enabled=true`、`connected=true`、`session_ready=true`;重复兼容渠道保持停用。
## 2026-08-18 — 文件获取统一转 PDF(已完成)
- `confirmation_export` 成功获取文件后统一转 PDF;转换失败、超时或无效输出回退源文件。
- OSS/AgentBus 附件链路保持一致;实际 `.doc` 已验证可生成有效 `.pdf`。
- 转换器路径已固定到运行环境的 bundled LibreOffice,面板已重启并通过 AgentBus 健康检查。
## 2026-08-18 — 外部 Agent 解析契约错误(进行中)
- 已读取用户提供日志:SSE 正常完成,但标准解析契约校验拒绝结果;确认没有插件调用和 ERP 写入。
- 已核对 `normalizeParseResult()`、解析结果 Schema、`lwlt-confirmation` 输入/输出契约和外部 parser prompt;当前阻断规则一致且不应绕过。
- 当前待确认:外部实际返回的 `status`、`blockers` 内容、`operation` 摘要及已发布 Profile 版本。未读取 `.env`,未发送外部请求,未修改业务代码。
- 定向解析器测试 50/52 通过;2 个 HTTP 边界用例因沙箱 `listen EPERM` 未执行成功,已记录为环境限制。
## 最近已完成里程碑
- AgentBus 源文件附件回传、HTTPS OSS URL-only 协议和平台下载入口已接通。
- 多用户渠道、持久化 accepted/result 回执、插件串行队列和历史任务超时自愈已完成。
- 历史文件名乱码读取兼容已修复;前端渠道页使用独立 `/channels` 路径。
## 验证与边界
- 项目规定的 check:repo 9/9、check、control-plane 59/59、legacy 202/202、build 和 git diff --check 均已通过。
- 本轮未执行 ERP 写入、未发送新的外部业务探测消息;用户既有未提交改动全部保留。
- 不读取、复制或输出 `.env` 等本地秘密配置内容。
## 归档
- 本文件压缩前完整快照:[archive/project-history/2026-08-18/progress-pre-compression-agentbus-status.md](archive/project-history/2026-08-18/progress-pre-compression-agentbus-status.md)。
- 更早历史进度和 findings 快照位于 `archive/project-history/`;归档仅供追溯,当前规则以源码、契约和本文件为准。