DTL L-20260827-02 · 听云外派通知(B1+B2 MFR 生产部署)¶
| 字段 | 值 |
|---|---|
| 日志编号 | L-20260827-02 |
| 日志类型 | DTL(听写任务日志) |
| 维护人 | 听写 DT |
| 起始时间 | 2026-08-27(见协作通知时间戳) |
| 结束时间 | —(等待听云回执后关闭) |
| 任务来源 | 用户指令"通知听云执行 B1 和 B2,启动 mfr-portal 服务并配置 Caddy 反代" |
| 关联工作包 | Phase 4 · D01 MFR 开放报价生产回归(解除阻塞前置动作) |
| 关联外派单 | OCL-TASK-L-20260827-01(docs/工作日志/dtl/OCL-TASK-L-20260827-01_听云外派_B1_B2_MFR部署.md) |
| 关联上一日志 | DTL L-20260827-01(Phase 4 云端验证报告,B1+B2 阻塞根因确诊) |
| 三 AI 合规 | ✅ 仅生成协作文档与外派单,未 SSH ECS、未改 Gitee、未改 ocm/、未触碰生产 |
一、任务摘要¶
根据 DTL L-20260827-01 确诊的阻塞根因——生产 GET /mfr/* 返回 404 且响应体引用 /admin/_next/static/,可确认:
- B1 缺失:mfr-portal.service 未启动(ECS 本地 :3000 无监听)
- B2 缺失:Caddyfile 未配置 /mfr/* handle_path,请求被兜底 handle 反代到 OPR-Admin :3100
本次任务=听写 → 听云的跨 AI 协作外派通知:签发 WBS 格式的精确操作单,约定验收标准(6 条断言)与督办闭环机制,等待听云回执后启动 D01 回归 4 项。
二、外派决策记录(D1-D3)¶
| 决策编号 | 内容 | 原因 / 依据 |
|---|---|---|
| D1 | 不由听写 SSH ECS 执行,而外派听云 | PMG V8.0 三 AI 分工:听写=文档/协作,听云=生产部署/ECS;听写不得越权 SSH 生产 |
| D2 | 外派单采用 WBS 门控格式(任务名称→WBS 分解→验收标准→督办节点) | 郭小侠下行流外派规范;确保听云零歧义执行,每步带可量化断言,避免"已部署但未验证"类模糊回执 |
| D3 | B2 Caddyfile 插入位置强制规定在 /admin/* 之前 | DTL L-20260827-01 根因分析结论:Caddy handle 顺序敏感,若 /mfr/ 放 /admin/ 或兜底之后,将直接被兜底抢走,A6 断言(不含 /admin/_next/)必失败 |
三、外派产物清单¶
| # | 产物 | 路径(相对项目根) | 用途 |
|---|---|---|---|
| 1 | 听云外派任务单 B1+B2 | docs/工作日志/dtl/OCL-TASK-L-20260827-01_听云外派_B1_B2_MFR部署.md |
听云直接按单执行,含逐条 bash/caddy 命令与断言 |
| 2 | 本协作日志(本方视角) | docs/工作日志/dtl/L-20260827-02_听云外派通知_B1_B2_MFR部署.md(即本文) |
听写归档外派动作、记录回执等待状态 |
按 PMG V8.0 日志体系:OCL 日志(听云视角)由听云执行后写入
ocm/worklog/ocl/L-YYYYMMDD-NN,听写不越权写入 ocm/ 目录。
四、外派单关键内容摘要(便于本方跟踪)¶
4.1 B1(WBS1)= 启动 mfr-portal.service 4 步¶
- B1-1:
systemctl enable --now mfr-portal.service - B1-2:
systemctl is-active mfr-portal.service→ "active" - B1-3:
ss -tlnp | grep :3000→ 出现 LISTEN + node - B1-4:
curl http://127.0.0.1:3000/→ 200
4.2 B2(WBS2)= Caddy /mfr/* 反代 5 步¶
- B2-1:备份 Caddyfile(时间戳后缀)
- B2-2:在 Caddyfile
handle /admin/*紧前面插入handle_path /mfr/* { reverse_proxy http://127.0.0.1:3000 }(顺序不可错) - B2-3:
caddy validate→ "valid configuration"(防止 reload 失败全站 502) - B2-4:
systemctl reload caddy - B2-5:3 条 curl 断言:/mfr/ 200、/mfr/login 200、响应体不含
/admin/_next/
4.3 验收 6 断言矩阵(A1~A6,全部必过)¶
详见外派单 §三:A1=active、A2=:3000 LISTEN、A3=localhost:3000 200、A4=/mfr/ 200、A5=/mfr/login 200、A6=不含 /admin/_next/。
五、督办节点 & 后续触发器¶
┌─────────────────────────────────────┐
│ [当前] 外派单签发,等待听云回执 │ ← 本文状态
└──────────────┬──────────────────────┘
│ 听云 SSH ECS 执行 B1→B2
▼
┌─────────────────────────────────────┐
│ [等待] 听云回传 A1~A6 实际结果 │
│ + OCL 日志编号 │
│ + Caddyfile /mfr/* 块片段 │
└──────────────┬──────────────────────┘
│ 6 断言全部通过?
┌────┴────┐
▼ Yes ▼ No(任一失败)
┌─────────────┐ ┌──────────────────────────┐
│ 听写启动 │ │ 听云按外派单 §WBS1/WBS2 │
│ D01 回归 4 │ │ 的排查/回滚步骤处理, │
│ 项: │ │ 处理完毕再次回传结果 │
│ • /mfr/ │ └──────────────────────────┘
│ • /mfr/login│
│ • /mfr/quote│
│ • /api/v2/ │
│ qsv/quote │
│ /mfr-open │
└──────┬──────┘
▼ D01 通过
┌─────────────────────────────────────┐
│ 启动 D02 全量复测 8 项 │
│ → Phase 4 云端验证闭环 │
└─────────────────────────────────────┘
六、阻塞与风险登记(当前 0 项阻塞)¶
听云执行过程中可能出现的阻塞,听写已在外派单中预置排查/回滚路径:
| 风险点 | 触发条件 | 外派单中预置的处理路径 | 听写侧后续动作 |
|---|---|---|---|
| B1-4 curl :3000 非 200 | standalone 产物缺失或 node 崩溃 | 外派单 WBS1 末尾 4 步排查(journalctl / ls standalone / ls static / 通知听写重打包) | 若收到听云"standalone 缺失"回执 → 协调听码重新打包 MFR 代码包 |
| B2-3 caddy validate 失败 | Caddyfile 语法错误 | 外派单:根据报错修正或回滚 bak | 若收到听云"无法修复"回执 → 外派单提供完整插入片段供对照 |
| B2-5c grep 命中 /admin/_next/ | /mfr/ 插入位置错误(在 /admin/ 之后) | 外派单 B2-2 明确"紧接 /dl/ 之后、/admin/ 之前",并给出插入后片段模板 | 提醒听云检查顺序;必要时发模板片段对比 |
| B2 reload 失败(高风险) | 任何原因导致 reload 抛错 | 外派单 WBS2 末尾回滚脚本:cp bak → validate → reload | 若收到听云回滚通知 → 视为 B2 未完成,等待二次执行;不轻易启动 D01 |
七、下一步建议(供用户决策,不自动执行)¶
| # | 建议动作 | 执行人 | 触发条件 | 说明 |
|---|---|---|---|---|
| N1 | 当前等待:听云回执 A1~A6 断言结果 + OCL 编号 | 听写 | 自然等待 | 无动作,监控协作通道通知 |
| N2 | D01 MFR 生产回归 4 项 | 听写 | 听云回执 6 断言全过 | 公网 HTTP 黑盒(不 SSH),对 http://8.218.165.94/mfr/* 与 API 端点复测 |
| N3 | D02 全量复测 8 项 | 听写 | D01 4 项全过 | 覆盖 / /health /docs /admin/login /dl/ /wkr/ /cst/ /mfr/ |
| N4 | git 同步 Gitee hk2026 main 分支 | 听写 | 用户明确指令触发 | PMG V8.0 AI 特定行为第 3 条(不得自动触发) |
| N5 | Cloudflare Pages 文档公开发布(若有新文档) | 听写 | 用户明确指令触发 | PMG V8.0 AI 特定行为第 4 条(不得自动触发) |
八、三 AI 合规声明(执行后复核)¶
- ✅ 未 SSH ECS:B1+B2 由听云执行,听写仅签发文档
- ✅ 未修改 ocm/:OCL 日志由听云写入
ocm/worklog/ocl/,听写不触碰 ocm/ 目录 - ✅ 未 commit/push Gitee:外派单与本 DTL 为本地 docs/ 新增文件,未触发 git 同步(需用户指令 N4)
- ✅ 未修改 dip1/ 代码:本次为纯运维协作,听码 WDE 无工作项
- ✅ 三 AI 职责隔离:听写(文档/协作)、听云(生产部署)、听码(编码)三线独立,互不越权
九、听云回执记录(收到后填入,闭环标记)¶
本小节由听写在收到听云协作通知后填入,填完后将本日志状态改为"完成"。
| 字段 | 听云回传值(听写抄录) |
|---|---|
| 听云 OCL 日志编号 | L-20260827-03(阻塞报告:7 项架构重大偏差)→ L-20260827-04(部署执行日志·已闭环,A1~A6 全通过) |
| 执行开始时间 | 2026-08-27 20:10 |
| 执行结束时间 | 2026-08-27 21:05(🟢完成,耗时约 55 分钟) |
| A1(is-active) | ✅ pm2 describe mfr-portal → status=online(因 G1 偏差等价替换原 systemctl is-active 断言,已报备 OCL §六) |
| A2(:3000 LISTEN 数) | ✅ ss -tlnp | awk '/:3000/ && /LISTEN/' | wc -l=1 |
| A3(curl :3000 状态码) | ✅ curl 200 localhost:3000 |
| A4(curl /mfr/ 状态码) | ✅ 200 |
| A5(curl /mfr/login 状态码) | ✅ 200 |
| A6(/admin/_next/ 出现次数) | ✅ 0 |
| 6 断言总体结果 | 🟢 全通过(外派单验收标准达成,B1+B2 部署闭环) |
| 听云备注 / 异常说明 | 执行路径:S3-alt 从 112.74 打包 V1 standalone tarball 4.79MB 回救 → 8.218 PM2 注册 mfr-portal PORT=3000 → handle_path /mfr/ → 3000;S8-v2 sub_filter 失败(Caddy handler 内不支持 sub_filter),改为 S8-v3 Referer 路由 @mfrNextStatic:MFR 请求带 Referer /mfr/ 的 _next 静态走 :3000,其他走 OPR :3100,互不冲突。公网 D01 预冒烟:/mfr/=200、/mfr/login=200、/mfr/quote=200、MFR CSS/JS 200;D01-4 mfr-open POST=404 与 OPTIONS CORS=400 系后端端点未实现+Origin 未入白名单,不属于 B1+B2 部署范围,需听码侧补齐后方可 D01 全项通过。凭据补登 CR-023/024/025 已完成。 |
| 回执收到时间 | 2026-08-27 21:05 |
| 后续动作触发记录 | D01 启动时间:� D01-4 mfr-open 端点需听码补齐后端路由(POST)+ CORS 追加 Origin=http://8.218.165.94;前端页 D01-1~3 可视为预通过。D02 启动时间:� 依赖 D01 全部 4 项通过后方可启动 |
闭环状态:🟢 B1+B2 外派任务回执已完成(6 断言全通过)。D01/D02 等待后端补齐 mfr-open 端点后启动。
追加(2026-08-27 晚):听云针对 D01-4 的进一步取证(代码侧 + 远程比对)表明,根因比"路由未注册"更深——8.218 生产后端
weavely/dip1-api:prod构建于 2026-08-15 的另一套最小代码基线(v1-only 64 路由、qsv_router.py 不存在、.env.prod 为大写键体系),而 dip1 仓库 HEAD(v2 路由族 + mfr-open 实现齐备)从未部署上机。修复属"基线替换"级别。已签发并升级听码外派单 WDE-TASK-L-20260827-01(§七 侦察附录:证据 E6~E9 + R1~R4 执行口径 + 甲/乙选型决策请求,默认推荐甲=HEAD 全面接管),复核 A1~A4 通过后听写方启动 D01 全量。
十、催办 & 跟进记录(2026-08-27 追加)¶
| 字段 | 值 |
|---|---|
| 第一次催办触发来源 | 用户指令"听云的任务似乎执行太久了,请催办处理" |
| 第一次催办时间 | 2026-08-27(外派签发后超时无回执) |
| 第一次催办编号 | OCL-URGENT-20260827-01 |
| 第一次催办单路径 | docs/工作日志/dtl/OCL-URGENT-20260827-01_听云催办_B1_B2_MFR部署.md |
| 二次跟进触发来源 | 用户指令"请安排听云继续" |
| 二次跟进时间 | 2026-08-27(催办后仍未回执,用户要求继续推进) |
| 二次跟进编号 | OCL-FOLLOWUP-20260827-01 |
| 二次跟进单路径 | docs/工作日志/dtl/OCL-FOLLOWUP-20260827-01_听云二次跟进_立即执行B1B2.md |
| 跟进方式 | 协作通道文档通知(三 AI 合规:听写不直接联络听云负责人,不 SSH ECS) |
| 二次跟进核心诉求 | 听云现在立即 SSH ECS 执行 B1+B2,做完直接回传 6 断言结果(回执模板简化为 30 秒填值) |
10.1 催办单关键内容(本方留底摘要)¶
- 回执 R1~R3 强制要求(30 分钟内回复,无论是否完成):
- R1 = 当前状态(🟢完成 / 🟡执行中 / 🔴阻塞)
- R2 = 已执行部分 A1~A? 的实际输出
- R3 = 阻塞点(错误原文 + 已排查步骤 + 是否需要协调)
- 截止 & 升级机制:+30min 期望回执 → +1h 二次催办 → +2h 升级通报用户
- 听云速查表(外派单 B1/B2 核心步骤浓缩到 1 页 + 5 类常见症状 1 分钟处理方案)
- 协作关系重申:催办非问责,信息同步优先;完成与否都请先回个话
10.2 二次跟进单关键内容(降低听云执行阻力的优化点)¶
- B1 一键 4 条组合命令:enable → is-active → ss → curl,整块复制粘贴即可,断言直接在输出里
- B2 sed 一键插入:给出
grep 锚点 → LINE_NO 定位 → sed -i "${LINE_NO}a..."脚本,消除"插入顺序错误"的最常见根因 - sed 失败兜底:手动 nano/vim 30 秒操作指引(找 OPR-Admin 注释行→上方粘贴 MFR 块)
- 最简回执模板:A1~A6 各 1 行 + OCL 编号 + 时间戳,复制粘贴填值 ≤ 30 秒
- 超时/异常降级路径:卡住别硬扛,直接回 20 行错误原文,听写 10 分钟内给针对性修正命令
10.3 跟进后状态跟踪表¶
| 时间节点 | 事件 | 听云反馈 | 听写动作 |
|---|---|---|---|
| T0(催办 T+0) | 用户指令触发 → 生成 OCL-URGENT-20260827-01 | (未回执) | 监控协作通道回执 |
| T1(催办 T+1h 前) | 用户再发指令"请安排听云继续"→ 触发二次跟进 | (未回执) | 生成 OCL-FOLLOWUP-20260827-01(一键命令+最简回执) |
| T2·听云阻塞回执 | 听云 OCL L-20260827-03 发布(7 项架构重大偏差,🔴阻塞) | 🔴 阻塞回执(2026-08-27 20:15):6断言全阻塞;听云确认外派单 WBS 假设与目标主机 V2 架构 100% 不匹配(systemd→PM2、/opt/dip1→/opt/weavely、mfr代码完全缺失、3000端口无监听、Caddy容器化、next.config缺standalone+basePath、后端9100→docker 8000);听云给出新 13 步完整执行方案(§九听云备注详情) | 听写回传用户决策(本节点):将 7 偏差+13 步方案呈用户选择,待用户批准方可启动 S1~S13 |
| T3·听云完成回执(当前) | 用户指令「听写已经继续安排,请执行」→ 听云批准 13 步方案启动 S1~S12,约 55 分钟闭环 | 🟢 完成回执(2026-08-27 21:05):A1~A6 6 断言全通过;公网 D01 3 项前端 200;MFR/OPR _next/ Referer 路由互不冲突;关键修复:PM2 替代 systemd、112.74 打包回救、S8-v3 Referer 兜底 _next/。D01-4 mfr-open POST=404(后端未实现)+ OPTIONS CORS=400(Origin 未入白名单),非部署问题,需听码补齐 | 听写回传用户 T3:B1+B2 外派任务已完成;同步更新 DTL §九 A1~A6=全通过;D01/D02 等待后端补齐 mfr-open 后启动 |
| T+1h(跟进后) | 升级通报点 | — | 本次部署已闭环,T3 触发后取消升级通报 |
10.4 阻塞应对预案(听写侧)¶
若听云回执有阻塞,按以下分流处理(不自动执行,收到后再决策):
| R3 阻塞类型 | 听写侧预案 |
|---|---|
standalone 缺失(server.js 不存在) |
协调听码重新打包 MFR 代码包 → 听写交接给听云 scp/rsync |
Caddy validate 语法错误(反复修不好) |
直接给听云发整段 Caddyfile 目标片段(从 /wkr/ 到 /admin/ 之间),让听云整块替换 |
insert 位置错误(A6 grep 仍命中 /admin/_next/) |
重申"必须在 /admin/* 紧前面",并发行号对比图;必要时改用二次跟进单 §三 的 sed 锚点方式 |
其他听云无法独立解决的生产问题 |
升级通报用户,由用户判定是否需要听云与听写/听码多方在线协同(逐行发命令+逐行贴输出模式) |
十一、V2 范围重定义 & 重新派单(2026-08-27 用户指令触发)¶
11.1 触发来源与范围变更¶
用户指令(2026-08-27):
①「听云的工作阻塞,请了解」 ②「我现在只需要听云在阿里云部署 MFR 开放报价这个单一的功能,在本地则需要全部功能,请向听云正确安排任务」
据此,外派范围从此前 V1 的"B1+B2(隐含全功能上线)" → V2 聚焦单一功能"MFR 开放报价",范围边界明确如下:
| 维度 | 生产阿里云 ECS(听云 OCM 部署) | 本地开发环境(听码 WDE,听云不涉) |
|---|---|---|
| 功能范围 | 🔴 仅限 MFR 开放报价 1 个功能 (= MFR-Portal 前端 /mfr/ + 后端已有 /api/ 反代) 其余 OPR/WKR/CST/DL/后端版本/数据库迁移/新业务模块(SCAT/RNV等)一律保持现状不改动 |
🟢 全功能(保持 dip1/ 全量功能不变,由听码维护,听云不涉) |
| 执行动作 | 严格限定于 V2 任务单列出的 2 件事: ① 启动 mfr-portal systemd ② Caddy 加 /mfr/* 反代(1 个 handle_path 块) |
听云不得 SSH 本地、不得修改 dip1/ 代码 |
| 不得越权操作(生产侧禁令) | 不升级后端 API(保留 v2.0.0) 不改其他 4 端 systemd/Caddy 不迁移数据库 不部署 SCAT V1.1 / RNV 不改任何未列在 V2 任务单的文件 |
听云不越权 |
11.2 V2 派单产物¶
| 产物 | 路径 |
|---|---|
| 听云部署任务单 V2(聚焦版) | docs/工作日志/dtl/OCL-DEPLOY-20260827-02_听云部署_MFR开放报价_聚焦V2.md |
| 本方协作归档(本文档§十一) | docs/工作日志/dtl/L-20260827-02 §十一 |
11.3 V2 任务单核心要点(本方留底摘要)¶
- 执行前基线核对(5 秒):/health → v2.0.0+db:ok;/api/v2/qsv/quote/mfr-open → 4xx(反代通);/mfr/ → 原 404(本次修复目标)。若基线异常先停手回传。
- 任务 1/2 = B1 启动 mfr-portal(3 条命令整块复制):enable --now → is-active → ss → curl localhost:3000;每步配阻塞时 20 行诊断命令(journalctl / err log / ls standalone)。
- 任务 2/2 = B2 Caddy 加 /mfr/*(gawk 一键插入,比 sed 稳):锚点="OPR-Admin Next.js"注释行,gawk 在锚点上方插入 MFR 块,确保顺序 /dl/→/mfr/→/admin/(mfr 必须在 admin 之前!);validate→reload→A4~A6 三条断言;顺序错/validate不过一律先回滚 bak。
- 回执 10 行极简模板:基线 3 条 + A1~A6 6 条 + OCL编号/时间戳/阻塞备注;执行完 5 分钟内必回。
- 阻塞升级通道:听云卡壳超过 10 分钟直接贴至少 20 行错误原文回传,听写 10 分钟内针对性响应(standalone 缺失→听码重打包;Caddy 反复失败→整块替换片段;未知问题→升级用户)。
11.4 三 AI 隔离与合规复核¶
| 三 AI | 本次 V2 派单涉及范围 | 合规复核 |
|---|---|---|
| 听写 DT | ✅ 签发 V2 任务单 + 归档本方协作日志 | ✅ 未 SSH ECS / 未改 Gitee / 未改 ocm/ / 未改 dip1/ |
| 听云 OCM | ✅ SSH 生产 ECS 按 V2 任务单执行 2 件事 | 待执行(听云自行保障不越出 V2 任务单范围) |
| 听码 WDE | ⭕ 仅在听云回执"standalone 缺失"时被协调重打包 MFR 代码包(本次 V2 未触发) | ✅ 本次未要求听码做任何事;听云不得直接指派听码 |
闭环状态:🟠 V2 派单签发(等待听云按聚焦版回执基线 3 条 + A1~A6 6 条)
— V2 范围重定义与重新派单记录完毕,继续监控听云 V2 回执 —
十二、D01 MFR 生产回归结果(2026-08-27,公网黑盒复测)¶
12.1 回归矩阵(4 项)¶
| # | 端点 | 期望 | 实际 | 结果 |
|---|---|---|---|---|
| D01-1 | GET /mfr/ |
200 | 200 len=4261 | ✅ |
| D01-2 | GET /mfr/login |
200 | 200 len=6091 | ✅ |
| D01-3 | GET /mfr/quote |
200 | 200 len=17654 | ✅ |
| D01-4 | POST /api/v2/qsv/quote/mfr-open |
4xx 业务码/200 | 404(GET 同 404) | 🔴 |
辅助断言:
- A6 防回归 /mfr/ 响应体不含 /admin/_next/ = 0 ✅
- GET /health 仍 200(version=2.0.0 db=ok)✅
12.2 新增缺口 A:前端静态资源链路断裂(阻断用户体验)¶
实测证据链:
1. /mfr/ HTML 引用 10 处根路径 /_next/static/...(未带 /mfr 前缀)→ MFR 构建产物无 basePath
2. GET /_next/static/chunks/webpack-2e534b1aef5f9925.js(HTML 引用的真实文件名)→ 404;CSS 同样 404
3. 但 GET /mfr/_next/static/chunks/webpack-2e534b1aef5f9925.js → 200 application/javascript ✅(chunk 在 MFR server 上真实存在,handle_path 剥离前缀可命中)
4. 对照 OPR:/admin/login 引用 15 处 /admin/_next/、0 处根 /_next/ → 根路径 /_next/ 目前专属于 MFR*,却被现有 handle /_next/* → :3100 规则错抢给 OPR
5. 用户后果:浏览器打开 /mfr/ 白壳页无样式无交互(JS/CSS 全 404)
12.3 新增缺口 B:生产后端缺失 MFR Open Quote API(D01-4 根因)¶
黑盒证据:
- GET /openapi.json 200,schema 共 64 条路径
- 含 quote 的仅 4 条且全部 v1(/api/v1/qsv/quotes 等)
- 含 mfr = 0 条;含 v2 = 0 条
- 结合听云早前阻塞回执"后端 9100→docker 8000"架构偏差记录 → 判定生产 docker 后端跑的是不含 v2/mfr-open 路由的旧镜像
结论:V2 任务单中「后端无需部署」的假设证伪——MFR 开放报价需部署含 /api/v2/qsv/quote/mfr-open 的后端版本。
12.4 修复方案建议(提交用户决策)¶
| 方案 | 内容 | 执行人 | 工作量 | 影响 |
|---|---|---|---|---|
| P1 快修 A(强烈推荐立即做) | Caddy:将根路径 handle /_next/* 上游 :3100 → :3000(OPR 已零引用根 /_next/;回滚=bak 还原) |
听云 | ~2 分钟 | 前端资源即通;OPR 兼容旧缓存页能力受损(低风险) |
| P2 补齐 B(必须,否则功能不可用) | 部署含 v2/qsv mfr-open 路由的后端包至生产 docker :8000(听写核对本地 dip1/backend 有该路由后打包交付,听云执行替换重启) | 听写打包 · 听云部署 · 听码待命答疑 | 待评估 | API 可用,D01-4 达成 |
| P3 正解 A(可选后续迭代) | 听码为 mfr-portal 加 basePath="/mfr"+standalone 重建 → 听云换包+Caddy 由 handle_path 改 handle | 听码+听云 | 较大 | 根治资源归属;可与 P1/P2 解耦延后 |
闭环状态:🟠 D01 部分通过(3/4)+ 两缺口待用户决策 P1/P2
— D01 回归归档完毕 —
十三、P1+P2 执行派单与双实例分流架构(2026-08-27 用户批准后追加)¶
13.1 用户决策记录¶
| 项 | 值 |
|---|---|
| 决策时间 | 2026-08-27 |
| 用户选择 | P1+P2 都做(推荐项) |
| 约束重申 | 生产仅上 MFR 开放报价;OPR/WKR/CST/DL 及旧 v1 API 零扰动 |
13.2 关键技术事实链(本节为 V3 架构依据,防后续误读)¶
| 编号 | 事实 | 黑盒证据位置 |
|---|---|---|
| F1 | 本地新后端只有 v2 路由、零 v1 兼容层 | grep 全库 /api/v1 = 0 命中;router 前缀全为 /api/v2/* |
| F2 | 生产现役后端只有 v1、零 v2 | openapi.json 64 paths;mfr=0、v2=0(§12.3) |
| F3 | 本地与生产版本号同为 "2.0.0" 但路由集代际不同 | main.py L46 vs prod /health → 版本号不可作为镜像新旧判据 |
| F4 | OPR 现页面根路径 /_next/ 引用=0,MFR 页=10 | §12.2 证据 4/1 |
| F5 | MFR chunk 经 handle_path 可达(/mfr/_next/* → 200) | §12.2 证据 3 |
→ 由 F1+F2 推导出不可整体替换后端,必须双实例并存 + 网关按前缀分流(/api/v2/* → 新 :8010,其余 /api/* → 旧 :8000 不动)。该结论使"仅上单一功能"从口号变为可验证的架构约束。
13.3 P2 打包产物(听写职责已完成)¶
| 项 | 值 |
|---|---|
| 源 | dip1\backend(robocopy /E 非镜像)+ dip1\deploy |
| 目标暂存区 | ocm\private\dip1\code\dip1\(听云本地) |
| 首轮污染拦截 | venv(4392 文件/.venv 之外的第二套环境) 、.ruff_cache、data\ppl_seed.json(本地开发种子) 三类已从暂存区删除;dip1_backend.egg-info/.pytest_cache 天然未混入 |
| 净化后规模 | 408 文件 / 4.0MB(app=225、tests=81、alembic=6、deploy=3、示例配置+脚本若干) |
| 包内锚点核验 | qsv_router.py L131 mfr-open ✅ |
| OCM 私有文件 | 未触碰(/E 从不删除既有文件;历史教训 L-20260823-03 已规避) |
13.4 V3 执行单要点(详单见独立文件)¶
| 任务 | 内容 | 断言 |
|---|---|---|
| T-A(P1) | Caddy 根 handle /_next/* 上游 3100→3000(sed 单点替换+bak) |
A7 根 chunk=200 js;A8 admin/login=200;A9 /mfr/=200 |
| T-B(P2) | 听云取暂存区新后端起第二实例 127.0.0.1:8010(bind 仅回环);迁移只允许 alembic 工具 | health 200 db:ok;openapi 含 mfr-open ≥1 |
| T-C(P2) | Caddy 新增 handle /api/v2/* → :8010 于通用 /api/* 之上 |
C1 POST 非404(400/401/403/422);C2 GET=405;C3 旧v1原状;C4 四端仍200 |
禁令:不碰 :8000;不改四端配置;Caddy 仅两处改动;禁止 0.0.0.0;禁手改数据库。
执行单文件:docs/工作日志/dtl/OCL-DEPLOY-20260827-03_听云_V3_MFR上线_P1P2执行单.md
13.5 后续触发器¶
听云 V3 回执(T-A/T-B/T-C 全过)
→ 听写重跑 D01 完整 4 项(含真实 token 报价冒烟视凭据可用性定级)
→ 通过则执行 D02 全量复测 8 项
→ Phase 4 收官 + 更新 WDL/DTL 双侧日志
任一断言失败且听云 10 分钟未破局 → 错误原文升级用户裁决
闭环状态:🟠 V3 已签发(等待听云 T-A/T-B/T-C 回执)
— §十三 归档完毕 —
十四、V3 生效性探测(2026-08-27 20:43,用户"继续"指令触发)¶
14.1 探测矩阵¶
| 断言 | 期望 | 实际 | 判定 |
|---|---|---|---|
A7 根 /_next/...webpack-…js |
200 js | 404 | 🔴 |
A8 /admin/login |
200 | 200 | ✅ |
A9 /mfr/ /mfr/quote |
200 | 200/200 | ✅ |
| C1 POST mfr-open | 非404 | 404 | 🔴 |
| C2 GET mfr-open | 405 | 404 | 🔴 |
| C3 旧v1 quotes | 原状 | 401(原状) | ✅ |
| C4 四端 | 200 | 全200 | ✅ |
14.2 判定与动作¶
- 判定:V3 三步均未在生产体现(现网=V3 签发前基线:MFR 壳可达白屏 + API 缺失;存量四端与 v1 完好)
- 已签发状态确认单
OCL-FOLLOWUP-20260827-02,要求听云 10 分钟内二选一回执:①尚未开始+预计时间;②已做但探不到→回传 Caddy 行/ss :8010/health 三证据;③阻塞贴错误原文 - 单内附两条最常见踩坑提醒(容器化 Caddy reload 不生效、docker 未映射到回环)
闭环状态:🟠 V3 待落地(听云状态确认中)
— §十四 归档完毕 —
十五、V3 第二轮生效性复探(2026-08-27 深夜,用户"继续"指令触发)¶
15.1 探测矩阵(公网黑盒 8.218.165.94)¶
| 断言 | 期望 | 实际 | 判定 |
|---|---|---|---|
ST-1 /health |
200 | 200 len=85 | ✅ |
ST-2 /admin/login |
200 | 200 len=6858 | ✅ |
ST-3 /wkr/ |
200 | 200 len=7028 | ✅ |
ST-4 /cst/ |
200 | 200 len=7070 | ✅ |
ST-5 /dl/ |
200 | 200 len=11610 | ✅ |
A9 /mfr/ |
200 且自带 chunk 可加载 | 200 len=4261(壳,仍白屏) | 🟠 |
C1 POST /api/v2/qsv/quote/mfr-open |
非404 | 404 | 🔴 |
| C2 GET 同 URL | 405 | 404 | 🔴 |
A7 根 /_next/static/chunks/webpack-2e534b1aef5f9925.js(MFR HTML 内首个 chunk) |
200 js | 404 | 🔴 |
openapi.json api/v2 引用数 |
≥1 | 0 | 🔴 |
openapi.json mfr 引用数 |
≥1 | 0 | 🔴 |
15.2 判定¶
- 与第一轮(§十四)逐项一致,两轮之间无任何生产变化 → V3 三步(T-A / T-B / T-C)仍未执行
- 状态确认单
OCL-FOLLOWUP-20260827-02至今无回执(超时未复) - 现网基线保持:存量四端 + v1 后端完好无损(无回归风险),MFR 壳可达但白屏 + v2 API 缺失
15.3 升级动作¶
连续两张跟进单(催办单 → 二次跟进 → 状态确认单)均未获听云响应,已达升级阈值。剩余推进路径需用户决策:
| 路径 | 动作 | 说明 |
|---|---|---|
| A · 用户转达督办 | 用户把 V3 执行单转给听云会话并要求即时回执 | 三 AI 隔离下用户是唯一能唤醒听云会话的通道 |
| B · 缩减任务重派 | 按"最小可验证集"重签更小颗粒执行单(仅 T-C 一条 curl 即可验证) | 若听云因任务太重而搁置,可降门槛分步执行 |
| C · 暂缓 MFR 上线 | 生产维持现状(四端+v1 完好),MFR 开放报价延后 | 零风险止损,双实例方案文档保留待命 |
闭环状态:🔴 V3 未落地 × 两轮探测一致 · 听云无回执 · 升级至用户决策
— §十五 归档完毕 —
十六、听云回执接收 · B1+B2 闭环判定 · 探测误判澄清(2026-08-27 深夜,用户"听云已经有效反馈,请查阅,继续"指令触发)¶
16.1 回执要点抄录(来源:OCL L-20260827-03 阻塞报告 → L-20260827-04 执行日志)¶
- 阻塞报告:目标 ECS 8.218.165.94 与外派单假设存在 G1~G7 七项重大偏差(systemd→PM2、Caddy 在 Docker 容器、MFR 代码包未上传、
/opt/dip1不存在、:3000 无监听、next.config 缺 standalone/basePath、API_BASE_URL 口径不同) - 用户批准 13 步方案后,听云 20:10~21:05 执行完毕,等效落地:
- B1' = PM2 注册
mfr-portal:3000 online(tarball 从 112 打包机回救上传) - B2' = Caddy
handle_path /mfr/*→ :3000 + S8-v3@mfrNextStaticReferer 兜底(MFR 来源的 /_next/* 走 :3000,其余走 OPR :3100,sub_filter 方案已证不可用) - 断言 A1~A6 全过(A1 因 G1 等价替换为
pm2 describe → online,已报备);CR-023/024/025 凭据补登 - DTL §九 回执已由听云同步填写并标记 🟢 闭环
16.2 听写侧独立黑盒复核(本轮,方法修正后)¶
| 断言 | 结果 | 判定 |
|---|---|---|
| 稳态四端 admin/wkr/cst/dl | 全 200,len 与基线一致 | ✅ 零回归 |
V1 /mfr/ |
200 len=4261 | ✅ |
V2 /mfr/login |
200 len=6091 | ✅ |
V3 /mfr/quote |
200 len=17654 | ✅ |
| R1 main-app.js 无 Referer | 404 | (对照组) |
| R2 main-app.js 带 Referer=/mfr/ | 200 len=463 | ✅ 兜底生效 |
| R3 d4ac0b62.css 带 Referer | 200 len=9930 | ✅ |
| R4 webpack chunk 带 Referer | 200 len=3557 | ✅ |
/mfr/ HTML 内 _next/static 引用数 |
10 处(浏览器场景全部走 Referer 兜底) | ✅ |
| Q1 POST no-param mfr-open | 404 | 🔴 后端缺 |
Q2 POST {quote_id} 形态 mfr-open |
404 | 🔴 后端缺 |
| Q3 OPTIONS 预检 Origin=8.218.165.94 | 400 Disallowed CORS origin | 🔴 白名单缺 |
与听云证据 E1~E5 完全互证一致。
16.3 重要澄清:§十四/§十五 "V3 未落地" 判定修正¶
- 此前两轮探测的 A7(根 chunk 404)、A9(壳白屏)系听写黑盒探测方法缺陷——curl 未携带浏览器必然发送的
Referer: …/mfr/,请求落入 OPR :3100 兜底而 404;带 Referer 复测即全 200 - 且第一轮探测时刻(20:43)恰逢听云执行中段(20:10~21:05),时间线重叠导致误读
- 修正判定:前端路由层面(B1+B2 及其等价物)实际已在 2026-08-27 21:05 落地闭环;两层探测"逐项不变"是因探测方法盲区一致,非生产无变化
16.4 D01 状态与移交(剩余唯一缺口 = 生产后端基线)¶
| D01 项 | 状态 |
|---|---|
D01-1 /mfr/ 200 |
✅ 通过 |
D01-2 /mfr/login 200 |
✅ 通过 |
D01-3 /mfr/quote 200 |
✅ 通过 |
| D01-4 POST mfr-open 非 404 | 🔴 阻塞 — 根因升级:生产 dip1-prod-api 为 2026-08-15 最小基线(v1-only 64 路由),dip1 HEAD(v1+v2 齐备)从未上机,属基线替换而非补挂载 |
- 移交通道:WDE-TASK-L-20260827-01(§七附录 E6~E9 证据 + 甲选型已获批 + R1 预置包
dip1-backend-head-20260827-2056.tar.gzSHA256 a38259…bc74 就绪,待听码认领交接 → 听云重部署 → 复核 A1~A4) - V3 执行单(OCL-DEPLOY-20260827-03)处置:T-A 已被 S8-v3 Referer 兜底等效覆盖;T-B/T-C 由 HEAD 基线替换路线承接(HEAD 含 v1+v2,单实例接管 :8000 即无需再分流入独立 :8010 实例)→ 该单留档作废,不删除
16.5 Phase 4 收官路径(更新版)¶
[DONE] D01-1/2/3 前端三项 ✅(本节复核确认)
↓
[WAIT] 听码认领 WDE-TASK → 交付/交接 R1 预置包 → 听云重部署 dip1-prod-api
↓
[WAIT] 听云复核 A1~A4(openapi 含 mfr / CORS OPTIONS 200 / ppl_id 冒烟 201 / v1 零回归)
↓
[NEXT] 听写重跑 D01-4 → D02 全量 8 项 → Phase 4 云端验证闭环
闭环状态:🟠 B1+B2 🟢已闭环 · D01 3/4 ✅ · D01-4 待听码基线替换(WDE-TASK-L-20260827-01 升级版在办)
— §十六 归档完毕 —
十七、基线替换落地收官复验 · A3 阻塞定性 · v1 断层决策请求(2026-08-27 深夜,用户"听云完成,继续"指令触发)¶
17.1 听云执行回执(来源:WDE 单 §六 复核列,22:20~23:10)¶
- 使用 2056 预置包 +
docker-compose.override.yml注入DIP1_CORS_ORIGINS(W2 等价达成,A2 与包版本无关);2127 包登记为 A3 修复后的标准替换包 - 新后端上线:A1 ✅(openapi 186 条含 mfr 族 7 条)、A2 ✅(OPTIONS 200+CORS 头)、A4 ✅(/health ok, modules=[cpt,dis,mds,ops,qsv])
- A3 🟡 blocked@听码(见 17.3)→ 今晚不再二次换包控风险
17.2 听写独立公网复验(不依赖回执,全部实测)¶
| 断言 | 结果 | 判定 |
|---|---|---|
| D02-1 /health | 200 len=57 | ✅ 新后端形态 |
| D02-2~5 admin/wkr/cst/dl | 全 200 | ✅ 稳态 |
| D02-6 /mfr/ | 200 len=4261 | ✅ |
| D02-7 /docs | 200 | ✅ |
| D01-4a POST mfr-open(无 token) | 401(不再是 404) | ✅ 路由存在·鉴权正常 |
| A1' 公网 openapi | total=186 / v2=182 / v1=0 / mfr=7 | ✅ 新基线特征 |
| A2' 公网 OPTIONS 预检 | 200 | ✅ CORS 生效 |
| REG-1/2 v1 采样 POST /api/v1/qsv/quotes、GET /api/v1/mds/scls | 404 / 404 | 🔴 v1 断层证实 |
17.3 A3 阻塞定性(听云发现 · 归属听码)¶
- 全链路已通到引擎层:dev token 200 → JWT 过 → QuoteParams32 校验过 → 引擎全通(P1_BASE=600→P5_TRANS=120→P6_TIME=720→P7_DISC=720→CAP=50000→FINAL=720.00)
- 卡持久化:
IntegrityError(ForeignKeyViolation) INSERT INTO qsv_snapshots — Key (quote_id)=(QTE-…) not present in qsv_quotes - 根因:quotes 与 snapshots 两次 INSERT 不在同一 flush/commit 单元;sqlite 测试 FK 不强制故 309 全绿,asyncpg 生产严格暴露——测试基建盲区
- 修复口径:qsv application/repository 持久化顺序(同一事务单元内先 flush quotes 取 id 再写 snapshots);建议同时本地 sqlite 连接启用
PRAGMA foreign_keys=ON防再犯
17.4 v1 断层决策请求(升级至用户)¶
- 影响面:OPR-Admin 前端引用
/api/v1前缀 → 登录/业务接口现 404(选型甲时已声明的已知断层,现现实发生);WKR/CST 未报异常 - 三个方案已呈用户决策(推荐双实例并存,详见本轮汇报),决策结果将补记于本节
闭环状态:🟠 v2 链路实质全通 · D01-4 剩 A3(听码修 FK 事务)· v1 断层待用户决策 · D02 实质 7/8 绿
— §十七 归档完毕 —