feat: ship deterministic parser and lifecycle release

This commit is contained in:
inman committed 2026-08-28 17:13:58 +08:00
1 parent 208c434b31
commit 7b5d855b09
176 files changed
+20248 -1362

No files matched your search

+34 -210
View File
@@ -1,223 +1,47 @@
# 项目进度
## 2026-08-24 — ERP 异常状态链接刷新加固(已完成)
## 2026-08-28 — AgentBus 断线后重启(已完成)
- 已按治理规则读取 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 写入、任务重试、重启、部署或外部发送;当前未提交改动及其他既有工作区改动均保留。
- 用户明确授权重启控制面;预检确认在途 task 与 `accepted/running` attempt 均为 0。旧进程组 `62152` 退出后,运行会话管理器自动从标准入口拉起新进程组 `66218`、服务 PID `66228`,8786 只有一个监听。
- 新实例 live/ready、数据库、Schema、迁移 014 正常;连续 25 秒 6 次采样均保持 AgentBus connected、session ready 和 4/4 渠道 ready。
- 未创建或变更任务,未重载扩展,未访问或写入 ERP,未部署或外发。
- 重启后门禁通过:仓库治理 9/9、TypeScript、控制面 127/127、legacy 248/248、build 与 diff 检查。
## 2026-08-22 — 取消产品/客户来源地强制匹配(已完成)
## 2026-08-28 — 新版运行态切换(已完成)
- 已从用户日志确认阻断来自 `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、未重启、未部署、未外发。
- 用户明确授权后,旧 8786 进程组已优雅停止;标准 `pnpm run dev` 新进程组 `62152`、服务 PID `62164` 成为唯一监听。live/ready、数据库、Schema、迁移 014 与 4/4 AgentBus 渠道均正常。
- 已通过操作台只读 API 确认 `confirmation_export` 使用 Program parser `v1.0.6` 与输入契约 `0.5.123`;在途 task、`accepted/running` attempt 及活动任务均为 0。
- 已重载本地“联泰下单助手”,握手为插件 `0.5.157` / 最低版本 `0.5.157` / 兼容;桥接已连接、ERP 会话正常、最近错误为无。诊断字段“ERP 链路恢复”仍为 `failed`,未访问 ERP 业务页扩大复测范围。
- 本次仅切换运行态并做只读健康/版本检查;未创建或变更任务,未访问 ERP 业务数据、执行 ERP 写入、部署或外发。
## 2026-08-20 — AgentBus 通讯测试(已完成)
## 2026-08-28 — 散拼母团“整团游客信息”导出(已完成)
- 面板 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 服务端回执核对。
- 已按项目治理规则恢复 README、task plan、findings、progress 和工作区状态,并通过业务登记定位到 `confirmation_export`、`lwlt-confirmation`、双 Schema、mapping、Program parser、平台 validator 与 Chrome 导出适配器。
- 已用报告同形输入离线复现:`整团游客信息` 返回 `program_invalid_value`;`游客信息`和`游客名单`均解析为 `visitor-list`。报告任务没有插件派发或 ERP 写入。
- 历史只读 ERP 证据确认:散拼母团整团游客源为 `orders_Visitor.asp?tid`;独立团/散拼具体子单游客名单为 `orders_Visitor.asp?did&tid`。当前活动源码只支持后者并明确禁止母团。
- 用户已授权增加该能力。设计收敛为同一 `confirmation_export` action、同一 canonical `visitor-list`、按 `existing_refs.kind` 做严格范围分流;母团只开放此单一文件类型。
- 已启用 Planning with Files、Skill Creator 和 Documents 工作流;未创建子智能体。由于 findings/progress 接近治理上限,已先逐字节冻结完整快照,再压缩活动摘要。
- 已补四组失败回归并取得预期红灯:Program 语义、Agent/执行契约、operation plan 参数和页内导出源都准确暴露当前缺口;测试基础设施正常。
- 已完成核心实现并让同一四组回归转绿:`整团游客信息`生成 `shared_plan + visitor-list`;Agent/执行 gate 拒绝母团其他类型和子单 ddid;operation plan 与页内 exporter 对母团使用 tid-only,现有子单/独立团路径保持 did+tid。
- 已同步双 Schema、mapping、平台最低版本、运营模板、`lwlt-confirmation`、业务/风险/证据登记和 AgentBus 回执边界;Program parser 升为 `v1.0.6`。
- 已发布扩展 `0.5.157`、五 Skill `0.5.125` 和运营 DOCX `0.5.123`。扩展/Skill 包逐文件匹配源码,DOCX 12/12 页无方框字、截断或重叠;旧制品及 `0.5.156` 清单已日期化归档。
- 全量门禁通过:仓库治理 9/9、TypeScript、控制面 127/127、legacy 248/248、build,以及 JS/JSON/ZIP/Skill、DOCX、哈希和 diff 检查。
## 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 登录/写入、任务重试、外部发送、重启或部署。
- Chrome 扩展 `0.5.157`:新增散拼母团整团游客 `shared_plan + visitor-list + tid-only` 窄导出;ZIP SHA-256 为 `872640668c52cf1ef0135ff51ec33e3c1f5dee304434fbb58ceee4cb3518fcd7`。
- Program parser `v1.0.6`、工作簿规范化器 `v1.1.0`、生命周期契约 `v2.9`、五 Skill `0.5.125`、运营 DOCX `0.5.123`。
- 名单确认覆盖规则:未确认的占用位要求确认;确认后所有附件指定序号都覆写,同值也写;父表单明确成功即完成。
- 8786 与 Chrome 扩展当前均已切换到本次发布基线:Program parser `v1.0.6`、输入契约 `0.5.123`、扩展 `0.5.157`,且操作台版本握手兼容。
## 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 网关/微信适配器检查下游展示。未向该下游主动发送测试消息。
- 不访问或写入 ERP,不查看或输出 `.env` 内容,不创建、补充、确认、重试、删除或派发真实任务。
- 用户已另行明确授权当前版本的 Chrome 扩展重载和 8786 重启;除此之外不部署、不调用外部 Agent/AI、不发送文件。
- 运行态切换仅包含进程/扩展重载与只读健康、版本检查;真实 ERP 路径验证仍需另行授权。
## 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/`;归档仅供追溯,当前规则以源码、契约和本文件为准。
- 预期红灯、旧版本断言、缺少 bundled `PyYAML` 及非登录 shell 缺少 bundled Node PATH 的启动/门禁命令均已记录在 `task_plan.md` 并修复;最终规定门禁全绿。
- 压缩前完整 progress 已按相同 SHA-256 `6e6c01b01a7fd294855edc1dcdf797c6ec0513f8b5e131f204660420341bd768` 冻结到 [2026-08-28 progress 快照](archive/project-history/2026-08-28/progress-pre-compression-shared-plan-visitor-export.md)。
- 更早完整过程见 `archive/project-history/`;归档只供追溯,不定义当前规则。