Files
LWLT-AIBOT/archive/project-history/2026-08-22/task_plan-pre-compression-source-region-rule.md
T

198 lines
16 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.
# 项目文件治理计划
## 当前任务:AgentBus 通讯测试(已完成)
- **目标:** 检查面板与 AgentBus 的实时双向通信,不主动发送新测试消息。
- **结果:** `health/ready`、`api/status` 正常;4 个渠道均 `connected/session_ready`;日志见 4 次握手、1 次入站、2 次出站、0 次断线或本地发送失败。
## 2026-08-20 — ERP 会话待机保活(已完成)
- **目标:** 在已有且允许访问的 ERP 标签页中,以固定周期发送带 Cookie 的只读请求,减少服务端因长期无请求而失效;不刷新页面、不新开标签、不干扰执行中的业务任务。
### 阶段
- [x] 设计并实现 `chrome.alarms` 定时器、现有标签页限定、执行中跳过、会话响应检测、状态记录和用户开关。
- [x] 增加定向静态回归,递增扩展版本并同步平台最低版本、mapping 和源码版本断言。
- [x] 生成版本化 ZIP/发布清单并运行项目规定完整验证。
### 当前边界与决策
- 保活只作用于 `https://lwlt.hisy.cc` 已存在标签页,默认约 5 分钟一次,首次延迟约 1 分钟;电脑/浏览器休眠导致的 alarm 延迟不宣称可覆盖。
- 页面侧使用 `GET /System/Mainlt.asp`、`credentials=include`、`cache=no-store`;不使用 `tabs.reload()`,不调用任何 ERP 保存接口,不改变 DOM 或业务 operation。
- `erpAutomationEnabled=false`、用户关闭“ERP 待机保活”、无 ERP 标签页、权限缺失或插件有执行中任务时跳过;失败只记录状态并在插件面板提示,不自动登录或绕过权限。
- `archive/` 只保存旧发布物,当前源码和 `dist/release-manifest.json` 为活动规则与交付入口。
## 当前任务:AgentBus 无受理/处理中/结果消息但任务成功的链路诊断
- **状态:** 诊断完成;只读检查,不修改业务源码,不重试任务,不发送外部消息,不重启或部署。
- **目标:** 从任务创建、状态事件、回复路由、AgentBus listener 和持久化 outbox 逐段确认为什么任务可成功而三类 AgentBus 消息均未到达,并区分设计行为、运行时配置/连接问题与代码缺口。
### 阶段
- [x] 读取治理规则、活动 planning 文件和当前工作区状态,确认不覆盖既有未提交改动。
- [x] 通过业务登记定位 AgentBus/当前业务契约,读取相关 Skill、Schema、mapping 和实现代码。
- [x] 追踪 accepted、processing、result 三类事件的生成、路由、持久化和发送条件,核对测试覆盖。
- [x] 结合现有日志/证据边界收敛根因;如缺少任务 ID 或运行时渠道快照,明确需要的最小补充证据。
- [x] 更新计划、发现和进度并给出只读诊断结论;不执行外部发送或任务重试。
### 当前边界与决策
- “任务成功”与“AgentBus 消息送达”分开判断;不能仅凭任务终态推断渠道发送成功。
- 不读取 `.env` 或其他秘密配置,不主动访问/发送 AgentBus,不重启控制面;仅检查非秘密配置样例、源码、测试和已有证据。
- `archive/` 只作追溯,当前源码、契约和活动测试优先。
### 错误记录
| 错误 | 处理 |
|---|---|
| 登记表链接的 `agent设计规范/businesses/confirmation_export.md` 不存在 | 不重复查找该路径;改用当前登记表、`business-behavior-registry.md`、`lwlt-confirmation` Skill、AgentBus 契约、Schema/mapping 与控制面实现核对 |
| 首次合并计划更新时把 findings 内容误放到 `task_plan.md` 匹配块,补丁未应用 | 已确认没有文件被修改;拆分为仅更新阶段状态和错误记录的补丁,不重复原匹配方式 |
| 直接调用 bundled Node 的 `--run check:repo` 时其脚本子进程找不到 `node` | 改用 bundled Node 与其 `node/bin`、fallback `bin` 一起加入本次命令的 `PATH`;不修改环境文件或持久化 shell 配置 |
### 诊断结论
- `processing` 消息不是当前协议的一部分;AgentBus 只发送一次 `task.progress(status=accepted)` 和一次终态 `task.result`。
- 任务成功与 AgentBus 送达解耦。手工来源或没有 `channel_id`/入站 frame 路由的任务不会生成 AgentBus delivery;AgentBus 入站任务则必须经过 accepted durable delivery,之后才会生成 result delivery。
- 若该任务确实来自 AgentBus 且 accepted/result 都没有,根因只能继续在任务发生时的 `source/channel_id`、`agentbus_deliveries` 状态或 listener 日志中区分;当前没有该任务 ID,不能把历史断点唯一归因给某个渠道或 WebSocket 错误。
- 本次只读探针显示当前 4 个启用渠道均 `connected=true`、`session_ready=true`;这是当前状态,不是该历史任务发生时的证据。
- 最新现场日志已定位到 `TASK-20260819102429-R13bn8w`:入站为 AgentBus,accepted 与 completed result 均出现 `outbound_durable_delivery_sent`,且 AgentBus 服务端随后返回 `accepted`/`delivered` 确认帧;控制面未出现该任务对应的发送失败或断线。
- 因此本轮诊断边界已从控制面收敛到 AgentBus 网关向微信适配器/会话的下游投递或展示;不改本地发送逻辑,不重试外部消息。
## 当前任务:confirmation_export Chrome host 权限阻断修复
- **状态:** 修复完成;两次用户任务均未写入 ERP,未重试、未部署。
- **目标:** 找出 `Cannot access contents of the page. Extension manifest must request permission to access the respective host.` 的实际触发路径,修复 `confirmation_export` 的受控浏览器执行并保持未知 host fail-closed;补充回归门禁、递增扩展版本并同步版本化制品。
### 阶段
- [x] 读取两份日志、活动 planning 文件、业务登记和当前工作区状态,确认两次失败均为同一权限错误。
- [x] 核对 Chrome manifest、ERP tab/redirect/frame 注入路径和当前测试覆盖,确定最小修复边界。
- [x] 实施权限/注入修复及回归测试;同步扩展版本、mapping、平台最低版本、ZIP 和发布清单。
- [x] 运行项目规定验证并记录结果;不执行真实 ERP 重试、写入、外部发送、重启或部署。
### 当前边界与决策
- 只处理 `confirmation_export` 浏览器执行前门禁与扩展发布同步;不重试用户给出的两个任务。
- 只允许当前登记的 ERP host/经验证重定向 host;不为规避错误而开放任意网站权限。
- 无法唯一确认页面 host、frame 或扩展版本时继续阻断,不伪造导出成功。
### 错误记录
| 错误 | 处理 |
|---|---|
| `agent设计规范/businesses/confirmation_export.md` 不存在,登记表中的链接为悬空入口 | 改用 `business-behavior-registry.md`、`lwlt-confirmation` Skill、Schema、mapping 和实现源码继续核对,并保留该治理缺口记录 |
| 对 `https://lwlt.hisy.cc/System/Mainlt.asp` 的只读 HEAD/重定向探测连接超时 | 不重复外部探测;转为基于本地 manifest、注入路径和测试夹具定位,真实 host 仍以浏览器运行时明确拒绝为准 |
| 默认 shell 没有 `node` 命令,首次语法检查未启动 | 使用 workspace bundled Node 绝对路径重跑;不修改 PATH 或环境文件 |
### 当前实现摘要
- `background.js`:`chrome.permissions.contains` 前检、批准 ERP origin/tab 复核、同源导航竞态一次重试、脚本注入错误结构化并 fail-closed。
- `LianSyn-platform/app.js`:桥接状态展示 ERP 页面权限;权限不可用时不再自动 claim/handoff 新任务。
- 发布:扩展 `0.5.137`,ZIP SHA-256 `6c00c6e8240fad80bc8fbe8e932dfaf22ad32e494c957717c2d7537785f09fd5`;`check:repo` 9/9 已通过。
### 最终验证
- `check`、`test:control-plane` 66/66、`test:legacy` 215/215、`build`、`git diff --check`:通过。
- 定向 operation plan:40/40;生命周期契约:47/47;`check:repo`:9/9。
- 未执行真实 ERP 任务重试、ERP 写入、外部发送、控制面重启或部署;浏览器 live host 因只读网络探测超时未进行实时复测。
## 当前任务:visitor-list XLSX 转换失败修复
- **状态:** 修复完成;未重试该 ERP 任务、未写入 ERP、未向 AgentBus 外发原始 XLS。
- **目标:** 找出 `visitor_xlsx_conversion_failed:conversion_failed` 的实际根因,确保 HTML-in-XLS 能生成可校验的真实 XLSX;转换失败时继续保持 fail-closed,不回传手机无法打开的原始 XLS。
### 阶段
- [x] 读取用户日志、活动 planning 文件和当前工作区状态,确认最终状态为 `blocked`。
- [x] 核对 `convertDocumentToXlsx()`、调用方和 LibreOffice 运行环境,使用脱敏 fixture 重现失败。
- [x] 实施最小修复并增加覆盖转换失败/成功与 AgentBus 可见性门禁的回归测试。
- [x] 运行项目规定验证;在用户已授权范围内重启面板并验证 live/ready 与 AgentBus 状态。
### 当前边界
- 只处理文件转换与交付契约;不重试原任务,不提交 ERP 写入,不发送外部业务消息。
- 原始 ERP `.xls` 只能作为平台源归档;游客信息对 AgentBus/微信仍只允许真实 `.xlsx`。
### 错误记录
| 错误 | 处理 |
|---|---|
| 首次脱敏 LibreOffice 复现脚本在 bundled Node 24 下同时使用 CommonJS `require` 与顶层 `await`,触发 `ERR_AMBIGUOUS_MODULE_SYNTAX`,尚未执行转换 | 改用纯 ESM `import` 形式重跑,不重复该脚本形态 |
| bundled macOS LibreOffice 将 HTML 输入按 Writer/Web 文档加载后直接导出 Calc XLSX 时收到 `SIGABRT`,输出目录只留下锁文件和临时文件 | 先比较保留 `.xls` 扩展名、HTML→ODS→XLSX 等不同导入路径;不把崩溃当作可交付结果 |
## 当前任务:散拼母团创建写后回查假阴性修复
- **状态:** 修复与版本化交付完成;不重提 ERP 创建请求,未执行真实 ERP 写入、重试或部署。用户授权后已重启控制面并通过健康检查。
- **目标:** 当 `shared_plan_create` 已收到 ERP 成功响应但精确团号回查暂未命中时,通过清空列表筛选、有限只读重试和按日期兜底回查正确收敛结果,避免把真实成功误报为 `erp_result_uncertain`。
### 已确认决策
- 任一 ERP 返回团号未命中即进入恢复回查,不再只按“返回团号数少于日期数”判断。
- 每次精确回查显式清空客户、产品、领队和状态等非目标筛选;允许有限次数延迟重查。
- 精确回查仍未完整命中时,按请求日期逐日唯一核验;任何歧义或缺失继续保持 `execution_uncertain`。
- 全过程只读回查,禁止再次调用 `SubmitInfoForm()` 或 `POST /System/DAT/plan.asp`。
### 阶段
- [x] 读取项目约束、活动 planning 文件、业务登记、业务页、Skill、Schema、mapping、日志与当前实现。
- [x] 实现精确团号回查的筛选清理与有限只读重试。
- [x] 修正按日期兜底触发条件并保留严格唯一门禁。
- [x] 增加回归测试,覆盖“ERP 返回完整团号但首次列表回查为空”的成功收敛与持续缺失阻断。
- [x] 递增扩展版本,同步平台最低版本、mapping、版本化 ZIP 和发布清单。
- [x] 运行定向测试及项目规定完整验证并记录结果。
### 错误记录
| 错误 | 处理 |
|---|---|
| 首次打包命令把扩展目录到项目 `dist/` 的相对路径写成 `../../../dist`,ZIP 未创建 | 已确认正确路径为 `../../dist`;不复用错误命令,改用正确显式目标重新打包 |
| 完整验证首次运行在控制面测试 `confirmation export preserves visitor Excel while converting other types` 失败:测试桩未生成 `.xlsx` 输出 | 已确认该测试与控制面游客 XLSX 并行改动在本任务开始前已存在:当前转换器要求 `.xlsx`,测试桩仍只写 `team.pdf`。为保留未确认的游客交付策略,本轮不修改;其余控制面 60/60 通过 |
| legacy 全量测试发现一处转义正则仍断言旧扩展版本 `0.5.134` | 该断言属于本次版本同步范围;定位后改为 `0.5.135` 并重跑 legacy,不重复错误断言 |
| 最终哈希复核脚本在命令替换中直接调用 `node`,当前 shell PATH 未持久注入 bundled Node | `check:repo` 与 `git diff --check` 已先通过;哈希复核改用 bundled Node 绝对路径单独重跑,不重复 PATH 假设 |
### 最终验证
- `check:repo`:9/9 通过;`check`、`build`、`git diff --check`:通过。
- 定向回查:14/14;生命周期回查门禁:1/1;legacy:214/214。
- 控制面:60/61;唯一失败是本轮未改动的游客 XLSX 测试桩与其并行实现不一致。
- 控制面重启后:`/health/live`、`/health/ready`、数据库、Schema 和迁移均正常;4 个 AgentBus 渠道全部连接并完成 session-ready。未触发 ERP 任务重试。
## 当前任务:visitor-list AgentBus XLSX 交付
- **状态:** 已实施并完成定向回归;保留原始 ERP `.xls` 归档,生成真实 `.xlsx`,AgentBus/微信只返回 `.xlsx`。未写入 ERP、未重试、未重启、未部署。
- **目标:** 修复 HTML-in-XLS 在手机/微信上的兼容性,同时不丢失 ERP 原始源证据,并让 AgentBus 对游客信息只发送移动端可打开的 XLSX。
### 阶段
- [x] 读取治理规则、活动 planning 文件和工作区状态。
- [x] 从用户日志确认 `Visitor.xls` 的文件名、MIME、字节数和 SHA-256。
- [x] 对照历史 ERP 实时源响应证据确认游客名单是 HTML-in-XLS,而非标准 BIFF/OLE `.xls`。
- [x] 核对插件 `arrayBuffer`/base64、控制面 native 分支、OSS 写入和下载响应均保持源字节。
- [x] 用户确认“源 `.xls` 归档 + 真实 `.xlsx` 交付”,并明确 AgentBus 返回 XLSX。
- [x] 增加 XLSX 转换器、双附件元数据和 AgentBus/回执可见性过滤;转换失败时阻断原始 XLS 外部交付。
- [x] 增加转换器、任务准备、回执和 AgentBus 回归测试;同步当前 Skill、Schema、mapping、插件提示和运营模板。
- [x] 完成表格产物结构验证及项目门禁验证。
### 当前结论
- 用户日志中的源文件为 9,377 字节,声明 `application/vnd.ms-excel; Charset=UTF-8`,文件名为 `LW-260816Z-A Visitor.xls`。
- 历史实时采集记录显示 `/System/Business/orders_Visitor.asp` 返回 `application/vnd.ms-excel`,但首字节为 HTML 文档头,属于 HTML-in-XLS wrapper;桌面 Excel 可兼容解析,手机 Office/微信通常按扩展名与真实签名拒绝。
- 插件用 `response.arrayBuffer()` 读取并计算 SHA/base64;控制面 `visitor-list` 分支沿用同一字节、文件名和 MIME;OSS 设置附件 disposition,因此当前证据不支持传输过程损坏。
- 仅改扩展名或 MIME 不能修复;移动端兼容需要真实 `.xlsx`(保留表格语义)或 PDF。生成派生文件改变了此前“游客信息保持 ERP 原生 Excel”的外部交付约束;经用户确认后改为“原始 XLS 仅平台归档,AgentBus/微信只交付 XLSX”。
### 既已完成的相关实施
- `confirmation_export` 现按类型交付:`visitor-list` 保留源 XLS 并生成真实 XLSX,AgentBus/微信只返回 XLSX;其余类型继续转 PDF,转换失败回退源文件。
- 已同步控制面、Skill、输出契约、Schema、mapping、插件提示、测试、版本化 Skill/扩展 ZIP、运营 DOCX 和发布清单。
- 散拼子单导出二次查询已移除固定“收客中”过滤,仍保留母团/子单/`ddid`/`tid` 唯一核验。
### 最终验证
- `check:repo` 9/9、`check`、控制面 66/66、legacy 214/214、`build`、`git diff --check` 全部通过。
- `lwlt-confirmation` Skill 官方 `quick_validate.py` 通过;运营 DOCX 15 页逐页渲染检查通过;扩展 0.5.136 ZIP 与发布清单哈希通过。
### 归档与约束
- 本文件超限前的完整版本已冻结于 [visitor 移动端诊断前计划](archive/project-history/2026-08-18/task_plan-pre-compression-visitor-mobile-diagnosis.md);更早快照见同目录 README。
- 保留工作区既有未提交改动;不读取、复制或输出秘密配置;真实 ERP 写入、外部发送、重启和部署需用户另行明确授权。