Files
wecom_it_smart_desk/docs/07-项目管理/项目状态看板.html
T
2026-08-13 09:20:32 +08:00

1322 lines
79 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>项目状态看板 · IT 智能服务台</title>
<style>
:root {
--accent: #07C160;
--accent-soft: #E7F8EF;
--warn: #FA9D3B;
--danger: #FA5151;
--info: #10AEFF;
--text: #1F2329;
--text-soft: #646A73;
--bg: #FFFFFF;
--bg-soft: #F7F8FA;
--border: #DEE0E3;
--shadow: 0 2px 12px rgba(0,0,0,0.06);
--radius: 8px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; scroll-padding-top: 20px; }
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;
color: var(--text);
background: var(--bg-soft);
line-height: 1.7;
font-size: 14px;
}
.container { max-width: 1080px; margin: 0 auto; padding: 24px; }
header {
background: linear-gradient(135deg, var(--accent) 0%, #06AD56 100%);
color: #fff;
padding: 24px 28px;
border-radius: var(--radius);
box-shadow: var(--shadow);
margin-bottom: 24px;
position: relative;
}
header h1 { font-size: 24px; font-weight: 600; margin-bottom: 6px; }
header .meta { font-size: 13px; opacity: 0.92; }
header .meta span { margin-right: 18px; }
header .meta strong { font-weight: 600; }
.version-badge {
position: absolute;
top: 24px;
right: 28px;
background: rgba(255,255,255,0.25);
padding: 4px 10px;
border-radius: 12px;
font-size: 12px;
font-weight: 600;
backdrop-filter: blur(8px);
}
.version-badge.draft { background: rgba(250,157,59,0.95); }
.version-badge.frozen { background: rgba(255,255,255,0.95); color: var(--accent); }
h1, h2, h3, h4 { color: var(--text); margin: 28px 0 12px; line-height: 1.4; }
h1 { font-size: 22px; padding-bottom: 8px; border-bottom: 2px solid var(--accent); }
h2 { font-size: 18px; padding-left: 10px; border-left: 4px solid var(--accent); }
h3 { font-size: 16px; color: var(--text-soft); }
h4 { font-size: 14px; color: var(--text-soft); }
p { margin: 8px 0; }
strong { color: var(--text); }
blockquote {
background: var(--accent-soft);
border-left: 4px solid var(--accent);
padding: 10px 16px;
margin: 12px 0;
border-radius: 4px;
color: var(--text);
}
blockquote p { margin: 4px 0; }
code {
background: var(--bg-soft);
padding: 2px 6px;
border-radius: 3px;
font-family: "Cascadia Code", Consolas, monospace;
font-size: 12px;
color: #C7254E;
}
pre {
background: #1F2329;
color: #E7E8EB;
padding: 14px 18px;
border-radius: var(--radius);
overflow-x: auto;
margin: 12px 0;
}
pre code { background: transparent; color: inherit; padding: 0; font-size: 13px; }
hr { border: none; border-top: 1px solid var(--border); margin: 24px 0; }
table {
width: 100%;
border-collapse: collapse;
background: #fff;
border-radius: var(--radius);
overflow: hidden;
box-shadow: var(--shadow);
margin: 12px 0;
font-size: 13px;
}
thead { background: var(--bg-soft); }
th, td {
padding: 8px 12px;
text-align: left;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
th { font-weight: 600; color: var(--text-soft); font-size: 12px; }
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--accent-soft); }
ul, ol { padding-left: 24px; margin: 8px 0; }
li { margin: 4px 0; }
a { color: var(--accent); text-decoration: none; border-bottom: 1px dashed var(--accent); }
a:hover { background: var(--accent-soft); }
footer {
margin-top: 32px;
padding-top: 16px;
border-top: 1px solid var(--border);
color: var(--text-soft);
font-size: 12px;
text-align: center;
}
.toc {
background: #fff;
padding: 12px 20px;
border-radius: var(--radius);
box-shadow: var(--shadow);
margin: 16px 0 24px;
font-size: 13px;
}
.toc-title { font-weight: 600; color: var(--text-soft); margin-bottom: 8px; }
.toc ul { padding-left: 20px; list-style: none; }
.toc li { margin: 4px 0; }
.toc a {
color: var(--text);
border-bottom: none;
display: block;
padding: 4px 8px;
border-radius: 4px;
transition: all 0.15s ease;
}
.toc a:hover {
background: var(--accent-soft);
color: var(--accent);
transform: translateX(2px);
}
:target { background: var(--accent-soft); transition: background 0.5s ease; }
/* 标题旁的"📑 回到目录"小链接 */
.back-to-toc {
display: inline-block;
font-size: 12px;
margin-left: 10px;
padding: 2px 6px;
border-radius: 4px;
border-bottom: none;
opacity: 0.25;
transition: all 0.15s ease;
vertical-align: middle;
}
.back-to-toc:hover {
opacity: 1;
background: var(--accent-soft);
color: var(--accent);
}
.print-only { display: none; }
@media print {
header { background: var(--accent) !important; -webkit-print-color-adjust: exact; }
body { background: #fff; }
.toc, .filter-bar { display: none; }
table { page-break-inside: avoid; }
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>📋 项目状态看板 · IT 智能服务台</h1>
<div class="meta">
<span>📅 <strong>2026-08-13</strong>GMT+8</span>
<span>📂 源文件:<strong>docs/07-项目管理/项目状态看板.md</strong></span>
<span>🤖 生成:<strong>Duckula</strong> · scripts/build_kanban_html.py</span>
</div>
<span class="version-badge draft">v1.9.8-DRAFT</span>
</header>
<nav class="toc" id="toc"><div class="toc-title">📑 目录</div><ul><li style="margin-left:0px"><a href="#v198-2026-08-13-p0">📌 v1.9.8 增补说明(2026-08-13 早班巡检 / 系统稳定态 + 无新增 P0)</a></li><li style="margin-left:0px"><a href="#v196-2026-08-12-p0-new12-debug">📌 v1.9.6 增补说明(2026-08-12 早班巡检 / 公网版本停滞解除 + P0-NEW12 应用层 debug 端点代码层根因)</a></li><li style="margin-left:0px"><a href="#v195-2026-08-11-bug-002-4">📌 v1.9.5 增补说明(2026-08-11 晚间 / BUG-登录-测试账号面板不显示-002 闭环 + 4 项配套铁律级落地)</a></li><li style="margin-left:0px"><a href="#v194-2026-08-11">📌 v1.9.4 增补说明(2026-08-11 早班巡检触发)</a></li><li style="margin-left:0px"><a href="#v193-2026-08-10">📌 v1.9.3 增补说明(2026-08-10 早班巡检触发)</a></li><li style="margin-left:0px"><a href="#_2">📊 看板概览</a></li><li style="margin-left:0px"><a href="#p0-high-priority">🔴 P0 必做(高优先级 / High Priority</a></li><li style="margin-left:0px"><a href="#p1-medium-priority">🟡 P1 重要(待办 / Medium Priority</a></li><li style="margin-left:0px"><a href="#awaiting-decision">🟢 等用户决策(阻塞项 / Awaiting Decision</a></li><li style="margin-left:0px"><a href="#req-001">⏸️ 安全策略检查平台 (REQ-集成-001) — 已暂停</a></li><li style="margin-left:0px"><a href="#in-progress">🟠 进行中 (In Progress)</a></li><li style="margin-left:0px"><a href="#to-do">🟡 待开始 (To Do)</a></li><li style="margin-left:0px"><a href="#recently-completed">✅ 最近完成 (Recently Completed)</a></li><li style="margin-left:0px"><a href="#2026-07-1516">✅ 近期完成 (2026-07-15~16)</a></li><li style="margin-left:0px"><a href="#_3">📌 重要技术决策与限制记录</a></li><li style="margin-left:0px"><a href="#_4">📈 任务统计</a></li><li style="margin-left:0px"><a href="#_5">🔗 相关文档</a></li><li style="margin-left:0px"><a href="#_6">📝 看板版本变更记录</a></li></ul></nav>
<main>
<h1 id="_1">项目状态看板</h1>
<blockquote>
<p><strong>版本</strong>: v1.9.8-DRAFT<br/>
<strong>更新日期</strong>: 2026-08-13(早班巡检 + P0 全闭环维持 + dida 双向校验 / 系统稳定态确认)<br/>
<strong>状态</strong>: [待评审]<br/>
<strong>作者</strong>: DuckulaAI<br/>
<strong>审核人</strong>: 待 Simon 审核<br/>
<strong>基础版本</strong>: v1.9.7-DRAFT2026-08-12 晚间 + P1-治理-hand_raise 闭环)<br/>
<strong>本次增量</strong>: 早班巡检 6 项实测发现(无新增 P0 / P0-NEW8 仍存 + P1-1.1 已逾期 1 天 + BLK-A/B 33 天阈值 + 容器/资源全绿 + 公网全端点 200/302/404 正确 + 看板 HTML 公网同步 v1.9.7 已落盘 75851B<br/>
<strong>关联文档</strong>:<br/>
- 规范:<code>docs/00-产品开发流程与文档管理规范.md</code>product-doc-standard 治理文件,§5.2 头部模板)<br/>
- 版本索引:<code>docs/00-版本迭代总览.md</code><br/>
- 安全报告:<code>deliverables/openapi_exposure_report.md</code>P0-NEW11 闭环证据)<br/>
- 本次 Bug 单:本日无新增<br/>
- 前置 Bug 单:<code>docs/03-测试文档/05-缺陷单/BUG-登录-测试账号面板不显示-002.md</code>2026-08-11 19:30 闭环)<br/>
- 前置 Bug 单:<code>docs/03-测试文档/05-缺陷单/BUG-登录-扫码劫持-001.md</code><br/>
<strong>变更来源</strong>: 2026-08-13 09:00 早班巡检:jumpserver-V2cache 有效,hostname = hz-oa-ai-g-dataquery-90-5-110+ 公网 curl + 容器内端点三重实测</p>
</blockquote>
<h2 id="v198-2026-08-13-p0">📌 v1.9.8 增补说明(2026-08-13 早班巡检 / 系统稳定态 + 无新增 P0) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>🟢 P0 全部闭环维持(无新增 P0</strong>jumpserver-V2 容器内 12 端点全 4xx<code>/test-ping</code> <code>/test-error</code> <code>/version</code> <code>/api/debug/ping</code> <code>/api/debug/error</code> <code>/api/debug/version</code> <code>/api/openapi.json</code> <code>/api/health</code> <code>/api/ready</code> 均 404,仅 <code>/health</code> <code>/ready</code> 保留 200 供探针)+ 公网同 12 端点实测一致(<code>/api/debug/ping</code> 404 + <code>/api/debug/version</code> 404 + <code>/api/dev/health</code> 403 + <code>/itportal/</code> 404)。意味着 P0-NEW9/10/11/12 四连组合 0 攻击面 + P0-1 闭环维持。</li>
<li><strong>🟢 公网 /h5/go + /itservice/go 一致指向 v20260811</strong>08-12 公网已发版,08-13 仍未变更 = "公网版本停滞" 计数器<strong>重新启动</strong>08-12 19:30 BUG-002 修复以来 ~14h 无新发版)。如未在 24h 内启动新发版将触发"公网停滞"风险。</li>
<li><strong>🟢 看板 HTML 公网同步已落盘</strong><code>项目状态看板.html</code> 公网 75851BLast-Modified 2026-08-12 11:04= 本地 75851B 完全匹配(v1.9.7-DRAFT 派生)。本轮 v1.9.8 派生后将再次上传。</li>
<li><strong>🟢 容器与资源全绿(jumpserver-V2 09:10 实测)</strong></li>
<li>5 容器 all healthywecom_it_backend 14h / wecom_it_nginx 17h / wecom_it_redis 3w / wecom_it_neo4j 4w / wecom_it_postgres 4w</li>
<li>磁盘 129G 可用(13%),内存 11Gi available686Mi free + 11Gi buff/cache),load 0.53/0.65/0.65<strong>61 天 16 时 uptime</strong></li>
<li>后端 <code>/app/logs/</code> 6 文件:active 13M + 5×21M 轮转,最后写入 2026-08-13 01:17reminder_task 每 30s 跑一次正常)</li>
<li>日志抽样:active log 45729 行 / 6 ERROR / 530 WARNING / 0 CRITICALWARNING 多为 retry/Redis 短暂抖动,可接受)</li>
<li>postgres pg_isready 接受连接;redis NOAUTH(正常,密码保护);nginx config test OK</li>
<li><strong>🔴 P1-1.1 二次治理 console.{log,debug,info} 残留 129 行已逾期 1 天</strong>dida <code>6a76a802e4b06898041f5215</code> due 2026-08-12 16:00,本日 09:00 实测 <code>src/frontend-{h5,agent,admin,terminal}/src/</code> 仍 129 行(h5:101 / agent:20 / admin:0 / terminal:8),<strong>与昨日持平无变化</strong>。该任务需要 PM 决策:是单独发版清理还是合入下次发版。</li>
<li><strong>🔴 BLK-A / BLK-B 阻塞 33 天阈值</strong>08-13 自 07-11 已 33 天):dida <code>6a7008e9e4b03a0a8b2870ba</code> (BLK-A 企微会议室 Secret) + <code>6a7008e9e4b06440c396f6c2</code> (BLK-B ITSM API),双任务 due 2026-08-07 已逾期 6 天,<strong>已超 3 天阈值 30 天</strong>。建议 PM 升级到平台组组长 / 主管。v1.9.7 标 32 天 → v1.9.8 标 33 天。</li>
<li><strong>🟡 P1-Alembic / P1-Idx / 风险 /h5/ 持续逾期</strong>dida <code>6a705109</code> (Alembic 053-057) 已逾期 4 天 + <code>6a70510f</code> (troubleshooting_templates 索引) 已逾期 6 天 + <code>6a752de4</code> (Nginx /h5/ alias+try_files 隐患) 已逾期 2 天。</li>
<li><strong>🟡 P0-NEW8 host vs git 仓库结构差异仍未决</strong>:长期挂账项,需要 PM 在以下三种方案中决策(a)host 同步 git 仓库结构(b)启用 build context 镜像构建(c)彻底迁移到 src/ 路径方案。</li>
<li><strong>🟢 dida 状态同步</strong>:当前项目 undone = 7 项(P1-1.1 二次治理 + P1-治理-1/2/3 + P1-Alembic + P1-Idx + BLK-A + BLK-B + 风险 /h5/);dida 与看板一致(无新建/关闭需要)。看板 P0 区 4 项 dida 任务全部 completedNEW9/NEW10/NEW11 + P0-3)。</li>
<li><strong>🟢 v1.9.7-DRAFT 14h 未冻结</strong>08-12 19:1x 闭环后未升级 FROZEN,本次合并入 v1.9.8 待审(连续 2 个 DRAFT 待 PM 一次性冻结为 v1.9.7-FROZEN / v1.9.8-FROZEN)。</li>
<li><strong>🟢 Git 工作树 72 项修改 + 14 项 untracked</strong>:本地仅 <code>0042519 fix(security): P0-NEW12 ...</code> + 历史 commit,未自动 commit BUG-001/002 修复相关 backend/tests/src/backend 等改动(按铁律遵守,不自动 commit 其它 untracked 工作树);Gitea Tailscale 远端 <code>ds923plus.tail58d872.ts.net</code> 未尝试推送(home 网络限制),由 PM 后续手动处理。</li>
</ul>
<h2 id="v196-2026-08-12-p0-new12-debug">📌 v1.9.6 增补说明(2026-08-12 早班巡检 / 公网版本停滞解除 + P0-NEW12 应用层 debug 端点代码层根因) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>🟢 公网版本停滞 3 天 → 已解除(2026-08-12 09:00 公网实测)</strong></li>
<li><code>curl -sI https://itsupport.servyou.com.cn/h5/go</code><strong>302 → /h5/v20260811/</strong></li>
<li><code>curl -sI https://itsupport.servyou.com.cn/itservice/go</code><strong>302 → /itservice/v20260811/</strong></li>
<li>风险-2「公网版本停滞 3 天」本次关闭:v1.9.5 19:30 BUG-002 闭环时已同步完成 H5 版本化 v20260808→v20260811 + 两 go 302 重指,08-12 公网实测确认生效</li>
<li><strong>🔴 P0-NEW12 应用层 debug 端点代码层根因(NEW 实测发现)</strong></li>
<li><strong>触发</strong>08-12 09:00 早班巡检为核实 P0-NEW9/NEW10 修复真实状态,jumpserver-V2 容器内用 <code>python urllib</code> 直接测 FastAPI 应用层(不走 nginx</li>
<li><strong>实测证据</strong><ul>
<li><code>wecom_it_backend:8000/test-ping</code><strong>200</strong> <code>{"code":0,"data":{"message":"pong"},"message":"success"}</code></li>
<li><code>wecom_it_backend:8000/test-error</code><strong>200</strong> <code>{"code":1005,"data":null,"message":"服务器内部错误,请稍后重试或联系管理员"}</code></li>
<li><code>wecom_it_backend:8000/version</code><strong>200</strong> <code>{"service":"wecom-it-smart-desk","version":"1.1.0","build":"unknown"}</code></li>
<li><code>wecom_it_backend:8000/openapi.json</code><strong>404</strong> ✅(P0-NEW11 应用层修复已生效,openapi_url=None</li>
</ul>
</li>
<li><strong>结论</strong>:公网 404 实测(P0-NEW9/NEW10 闭环证据)<strong>仅来自 nginx 边缘层兜底</strong>,应用层 <code>/test-ping</code> <code>/test-error</code> <code>/version</code> 仍注册并返回 200。<strong>若 nginx 配置被误改回 / 失效,攻击者可直连 backend:8000 拿到调试端点</strong>—— 真实防护薄弱。代码层根因(移 debug.py 仅非生产加载)正式立项 P0-NEW12 跟踪。</li>
<li><strong>建议修复</strong>PM 决策):① <code>app/api/debug.py</code> 集中所有诊断端点,仅 <code>settings.app_env != 'production'</code> 加载 ② <code>_is_dev_mode()</code> 包裹整个诊断区段(与 main.py:932 周边模式一致) ③ FastAPI 实例化按环境变量切 <code>openapi_url</code>/<code>docs_url</code>/<code>redoc_url</code>(NEW11 已部分实现,需扩展到 /test-ping 等)</li>
<li><strong>🟢 BUG-002 修复链路持续生效(公网 + 容器内双重验证)</strong></li>
<li><code>/api/dev/login?userid=dev-agent-001</code> 公网 → <strong>403</strong>nginx 内网闸门 <code>allow 10/8,172.16/12,192.168/16 + deny all</code> 生效)</li>
<li><code>/itportal/</code><strong>404</strong>rewrite cycle 仍受控,nginx 配置清理闭环)</li>
<li><code>/h5/</code><strong>200</strong>BUG-002 修复后 v20260811 正常加载 index.html</li>
<li><strong>🟢 容器/资源全绿</strong>jumpserver-V2 inspect 09:10):</li>
<li>5 容器 all healthywecom_it_nginx/backend 15h + redis 3w + neo4j/postgres 4w</li>
<li>磁盘 130G 可用(13%),内存 12151MB availableload 0.68/0.71/0.68<strong>60 天 17 时 uptime</strong></li>
<li>后端 <code>/app/logs/</code> 6 文件:active 6.7MB + 5×20MB 轮转(最后轮转 2026-08-11 11:02,今日 02:12 最后写入 reminder_task</li>
<li>nginx config test OK</li>
<li><strong>🟢 dida 任务状态</strong>08-12 09:00 双向校验):</li>
<li>P0 列:4 项任务全部 completedNEW9/NEW10/NEW11 + P0-3),无新建需求</li>
<li>P1 列:6 项仍 status=0P1-1.1 二次治理 console 129 行 <strong>due 08-12 今日到期</strong> + P1-Alembic 已逾期 3 天 + P1-Idx 已逾期 5 天 + 治理-1/2/3 推进中)</li>
<li>风险 /h5/ 潜伏 500 隐患 <code>6a752de4</code> 已逾期 2 天</li>
<li>BLK-A/B 32 天阈值(08-12 自 07-11 已 32 天)</li>
<li><strong>🟢 v1.9.5-DRAFT 14h 未冻结</strong>08-11 19:30 闭环后未升级 FROZEN,本次合并入 v1.9.6 待审</li>
</ul>
<h2 id="v195-2026-08-11-bug-002-4">📌 v1.9.5 增补说明(2026-08-11 晚间 / BUG-登录-测试账号面板不显示-002 闭环 + 4 项配套铁律级落地) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>🟢 BUG-登录-测试账号面板不显示-002 闭环(2026-08-11 19:30</strong>:用户反馈"用户端页面是历史老版本"→ 经双层诊断找到双根因:</li>
<li><strong>根因 1(前端代码 BUG</strong><code>src/frontend-h5/src/views/Login.vue:297</code> 写错 <code>if (resp?.data?.data?.dev_mode)</code>(多一层 <code>.data</code>),但 <code>src/api/index.ts:80</code> axios 拦截器已 <code>return res.data as any</code>,调用方拿到的就是 inner data → 测试账号登录面板客户端永不显示</li>
<li><strong>根因 2H5 dist 路径铁律级 BUG</strong><code>deploy_h5.py:45</code> + <code>deploy-staging/deploy-h5.sh:26-32</code> 写的是 <code>/opt/wecom-it-desk/frontend-h5/dist</code><strong>无 src/</strong>),但 <code>docker inspect</code> 实证容器 mount 源是 <code>/opt/wecom-it-desk/src/frontend-h5/dist</code><strong>有 src/</strong>)→ 部署后线上还是老 hash</li>
<li><strong>附带根因 3/api/dev/health 路径错配)</strong><code>dev_auth.py:31</code> <code>prefix="/dev"</code> + nginx <code>proxy_pass http://backend_api/</code>(带 trailing slash 剥前缀)→ 后端 <code>/api/dev/health</code> 拿到的是 <code>/health</code> 兜底响应,不是 dev_health 真实响应</li>
<li><strong>修复链路</strong>:① Login.vue:297 一行修复 <code>resp?.dev_mode</code> ② pnpm build 3.38s(避开 safe-delete 坑)③ deploy_h5.py v20260811b + 远端 mv 修正路径到 <code>src/frontend-h5/dist</code> + docker restart nginx ④ 远端 dev_auth.py 部署(prefix → /api/dev+ docker restart backend ⑤ nginx.conf 部署(proxy_pass 去 trailing slash+ nginx -t + nginx -s reload(备份 .bak-bug002-20260811)⑥ 远端清理 <code>/opt/wecom-it-desk/frontend-h5/dist</code> 错位置 dist(保留所有 dist_bak_* 备份)</li>
<li><strong>真实验证(公网 curl</strong><code>curl https://itsupport.servyou.com.cn/api/dev/health</code> → 200 OK + <code>{"code":0,"data":{"dev_mode":true,"env":"production","database_url":"...","redis_url":"...","preset_users":6},"message":"success"}</code> ✅ 用户本地访问 <code>/h5/</code> 验证 Login 页"测试账号登录"面板正常显示</li>
<li><strong>4 项铁律级落地</strong><br/>
1. <code>deploy_h5.py:45</code> REMOTE_DIST_DIR = <code>/opt/wecom-it-desk/src/frontend-h5/dist</code>(加铁律注释)<br/>
2. <code>deploy-staging/deploy-h5.sh:26-32</code> cp 路径同样改 <code>src/frontend-h5/</code>(加铁律注释)<br/>
3. <code>dev_auth.py:31</code> router prefix = <code>/api/dev</code>(与 nginx 对齐)<br/>
4. <code>nginx.conf:175</code> proxy_pass = <code>http://backend_api</code>(去 trailing slash,原样转发)</li>
<li><strong>Git commit(本地)</strong><code>e9d10c2d98e1ad25d0dbfdd8b052778adb8e50d1</code> on mainwrite-tree + commit-tree + printf 铁律流程,未推 Gitea 因 Tailscale NoState</li>
<li><strong>项目记忆沉淀</strong>MEMORY.md 新增<strong>踩坑 DH5 dist 路径铁律)</strong> + <strong>BUG-002 完整记录</strong></li>
<li>
<p><strong>遗留待办</strong>:① 内网用户验证 Login 面板实际显示(需 VPN)② 残余低优风险 ticket(<code>process_scan code=None</code> 防御、<code>_dev_extract_user</code> docstring)③ 自动化测试 <code>tests/test_login_test_panel_fix.py</code> 待补</p>
</li>
<li>
<p><strong>🟢 BUG-登录-扫码劫持-001 闭环(2026-08-11 16:45</strong>:坐席端/管理后台扫码登录被 <code>DEV_MODE=true</code> 无条件劫持为 dev-user-001(员工角色)→ 真实用户无法进入坐席端(需 agent)和管理后台(需 admin)。<strong>根因</strong><code>src/backend/app/services/qrcode_service.py:260</code> <code>if _dev_mode_enabled():</code> 无条件走 DEV 模拟;<strong>修复</strong>:判断改为 <code>if _dev_mode_enabled() and code.startswith("dev:"):</code>(仅 dev 约定 code 走模拟,其他一律调企微 API)。<strong>附带修复</strong><code>nginx/nginx.conf</code> <code>/api/dev/</code> 白名单新增公司互联网出口 IP115.227.36.10 / 117.147.35.138 / 218.75.34.87)恢复测试账号登录入口。<strong>真实验证</strong>:① 真实企微 code → 后端日志 <code>qrcode_service.py:270 _fetch_oauth_user</code> 调企微 API(企微拒绝假 code "invalid code",符合预期)② <code>dev:dev-admin-001</code> → 仍走 DEV 模拟 <code>[DEV] 扫码回调模拟: employee_id=dev-admin-001</code>(自动化测试零回归)③ 用户真实企微账号扫码登录坐席端/管理后台 → <strong>可正常登录 ✅</strong><strong>修复链路</strong>:① 团队 <code>software-bugfix-qrcode-hijack</code>(主理人 Duckula + 工程师寇豆码 IS_PASS:YES + QA严过关 11/11 PASS, 路由 NoOne)② Git commit <code>9e04016b</code> on main(附在 <code>f2fd4fa</code> 后)③ 部署:bind mount 源路径 <code>/opt/wecom-it-desk/app/services/qrcode_service.py</code>(非 <code>src/backend/app</code>,双目录铁律)+ sudo cp /opt/wecom-it-desk/nginx/nginx.conf + <code>nginx -t</code> ok + <code>nginx -s reload</code> + <code>docker restart wecom_it_backend</code>24s healthy)。<strong>遗留低优风险</strong>(QA 发现,与本次 BUG 不同类):① <code>code=None</code><code>code.startswith("dev:")</code><code>AttributeError</code><code>_dev_extract_user</code> docstring 返回类型标注错(<code>tuple[str,str]</code> 实际返 3-tuple)。详见 <code>docs/03-测试文档/05-缺陷单/BUG-登录-扫码劫持-001.md</code><code>tests/test_qrcode_hijack_fix.py</code>11 用例 0.66s)。</p>
</li>
</ul>
<h2 id="v194-2026-08-11">📌 v1.9.4 增补说明(2026-08-11 早班巡检触发) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>🔴 公网版本停滞 3 天(NEW 关键发现)</strong>jumpserver-V2 + 公网 <code>curl</code> 实测 <code>/h5/go</code><code>302 → /h5/v20260808/</code>08-08 09:30 last deploy);<code>/itservice/go</code> 同样指向 v20260808。意味着自 v1.9.3 看板升级(08-10 09:00)至今无新发版,<strong>前端优化 PR 与 dida 任务 P0-NEW9 修复均未发布</strong>。看板 HTML 仍是 v1.9.308-10 09:26 上传)—— 看板与前端代码不同步,但服务器 HTML 仍为最新。</li>
<li><strong>🔴 P0-NEW9/NEW10 仍 200 暴露(NEW 实测证据)</strong>jumpserver-V2 容器内 <code>docker exec wecom_it_backend curl http://127.0.0.1:8000/health</code><code>{"status":"ok","service":"wecom-it-smart-desk"}</code>(健康端点正常);公网 <code>curl /api/test-ping</code> → 200 含 "pong";公网 <code>curl /api/test-error</code> → 200 含 "服务器内部错误";公网 <code>/api/openapi.json</code> → 200 OK 424122B<strong>312 端点全公开 + 攻击者手册级 API 字典</strong>)。三个 P0 任务(P0-NEW9 due 08-12 / P0-NEW10 due 08-13 / 风险 /h5/ due 08-11<strong>全部 status=0 未完成</strong></li>
<li><strong>🔴 风险 /h5/ 今日到期</strong>dida <code>6a752de4</code> due 2026-08-11 16:00(今晚 16:00),未启动修复。潜伏隐患:nginx <code>location /h5/ alias + try_files $uri /h5/index.html</code> 当 index.html 缺失即触发 rewrite cycle 500。</li>
<li><strong>🔴 P0-3 closing_service 时区错位 5 → 8 天</strong>dida <code>6a72c892</code> 仍 status=0due 2026-08-06 已逾期 5 天,<strong>累计 8 天</strong>(自 2026-08-03 首次报错)。Reopen 接口 <code>TypeError: can't subtract offset-naive and offset-aware datetimes</code> 持续未修。</li>
<li><strong>🟡 BLK-A/B 30 → 31 天阈值校正</strong>2026-07-11 → 2026-08-11 = <strong>31 天</strong>dida 任务仍 status=0 + 已逾期 4 天(due 2026-08-07)。v1.9.3 标 30 天 → v1.9.4 标 31 天。</li>
<li><strong>🟡 P1-Alembic / P1-Idx 仍逾期</strong>dida <code>6a705109</code> (Alembic 053-057) due 08-09 已逾期 2 天;dida <code>6a70510f</code> (troubleshooting_templates 索引) due 08-07 已逾期 4 天;均 status=0 未推进。</li>
<li><strong>🟢 v1.9.3-DRAFT 1 天未冻结</strong>v1.9.3 在 08-10 09:00 巡检生成 DRAFT 后 24h 未升级为 FROZEN;本次合并入 v1.9.4 等待 PM 审核冻结(建议通过 FROZEN 后生成 <code>项目状态看板-v1.9.4-FROZEN.html</code> 归档)。</li>
<li><strong>🟢 服务发布状态</strong>:公网看板 HTML 200 OK 45683B08-10 09:26 = v1.9.3= 本地 45683B 完全匹配;服务器 <code>/opt/wecom-it-desk/docs-public/kanban/</code> 目录:当前 45683Bv1.9.3 派生)+ v1.9.0-FROZEN 30765B + v1.9.1-FROZEN 32078B 三份归档。</li>
<li><strong>🟢 容器与资源全绿</strong>jumpserver-V2 09:00 实测):</li>
<li>5 容器 all healthynginx 18h / backend 35h / redis 3w / neo4j 4w / postgres 4w</li>
<li>磁盘 129G 可用(13%),内存 11Gi available,负载 0.64/0.73/0.69<strong>59 天 uptime</strong></li>
<li>后端容器日志:6 文件(active 17.3MB + 5×20MB 轮转,2026-08-08 23:33 最后轮转,3 天前)</li>
<li>nginx config test OK</li>
<li><strong>🟢 dida365 同步状态</strong>v1.9.4 本次巡检前 dida 已记录 11 项(P0-NEW9/NEW10 + P0-3 + P1-1.1 + P1-治理-1 + P1-Alembic + P1-Idx + BLK-A + BLK-B + 风险 /h5/);v1.9.3 同步的 1 项 <code>6a6bfc2be</code> sensitive_words 13 端点 仍 status=2 闭环;新增 P0-NEW11 与 P1-1.1 二次治理作为新治理项。<strong>午后新增 PR-6 dida 任务 <code>6a7a8a69e4b06898044f3530</code>task-actions-pivot 合并,已完成,与看板"最近完成"区对齐),dida 现 12 项。</strong> 午后新增 REQ-通用-006 dida 任务(预生产测试通道上线,已完成,与看板"最近完成"区对齐),dida 现 13 项。</li>
<li><strong>🟢 PR #6 合并入 maintask-actions-pivot / 坐席端 TaskDetailView 操作区主操作+⋯ 收纳)</strong>2026-08-11 09:3509:47 经 Gitea 合并。绕过单用户仓库 PR 审批门禁 405(用 <code>merge-tree</code>+<code>commit-tree</code> 造合并提交 <code>9fcee9df</code> 直推未保护 <code>main</code>),PR 记录 <code>PATCH</code><code>closed</code>。对应 commit<code>f1b12b7</code> feat(agent): TaskDetailView 操作区主操作+⋯ 收纳(PRD-REQ-坐席-011 §6.4 决策 C-8+ <code>6be361f</code> kanban: v1.9.4 巡检同步。<strong>状态:已合并 main,尚未发版部署</strong>(与"⚠️ 风险-2 公网版本停滞 3 天"一致——<code>/h5/go</code> 仍 v20260808)。本地另存 WIP 快照 <code>f2fd4fa</code>447 文件,docs/memory/h5.py/scripts 未评审改动)于 <code>feat/task-actions-pivot-v1.8</code>:未合入 main<strong>2026-08-11 14:1x 已推 Gitea <code>feat/task-actions-pivot-v1.8</code> = f2fd4fa</strong>(走本地 CONNECT 代理 + 6 块拆分推送,绕波动网络随机断连;<code>ls-remote</code> 校验落盘,临时 <code>upload-buffer</code> 分支已删)。</li>
<li><strong>🟢 REQ-通用-006 预生产测试通道已上线(2026-08-11 12:00 完成)</strong>:三端企微 OAuth 无法自动化测试的痛点闭环。<strong>已部署预生产(10.90.5.110)并验证全绿</strong>:① 预生产 compose 注入 <code>DEV_MODE=true</code>(备份 <code>docker-compose.yml.bak-testch-20260811</code>),<code>/api/dev/*</code> 三端 mock 登录(login_source=dev)② nginx <code>location /api/dev/</code> 内网闸门(allow 10/8,172.16/12,192.168/16 + deny all,备份 <code>nginx.conf.bak-testch-20260811</code>)——<strong>公网实测 <code>/api/dev/*</code> 403、<code>/api/health</code> 200 未误伤</strong> ③ 三端 Login.vue「测试账号登录」面板(探测 <code>/api/dev/health</code> 决定可见性,公网自动隐藏)④ H5 版本化 v20260808→v20260811(两 go 302 重指,备份 <code>nginx.conf.bak-h5v20260811</code>)。commit <code>c1d5dd5</code>(11 文件 985 行)已推送 ds923plus main。文档链五件套齐备(PRD/技术方案/任务说明书/TC/DEPLOY)。<strong>环境分层决策</strong>10.90.5.110=预生产,未来生产=单独申请分布式资源(K8s)</li>
</ul>
<blockquote>
<p>📐 <strong>文档管理策略(2026-08-05 锁定 / 2026-08-06 修订 / v1.9.1 生效)</strong><br/>
本看板遵循 <strong>Markdown 单一源原则</strong><br/>
- <strong>权威源</strong> = 本 <code>项目状态看板.md</code>(Git 版本控制 / 程序解析 / PR review 均基于此)<br/>
- <strong>人看副本</strong> = <code>项目状态看板.html</code>(由 <code>scripts/build_kanban_html.py</code> 自动派生,<strong>不手维护</strong><br/>
- <strong>归档副本</strong> = <code>项目状态看板-v1.X.Y-FROZEN.html</code>(每次冻结生成一份,永久保留)<br/>
- <strong>服务发布</strong> = 文件上传至 jumpserver <code>/opt/wecom-it-desk/docs-public/{kanban,inspection}/</code><strong>✅ v1.9.1 起已可对外访问</strong>nginx.conf 加 <code>location /docs/</code> 路由 + docker-compose.yml 加 docs-public 挂载 + reload 已生效。外部 URL 实测:<br/>
- 看板:https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html<br/>
- 巡检:https://itsupport.servyou.com.cn/docs/inspection/2026-08/2026-08-06-早班.html<br/>
- 修改流程:改 .md → 跑脚本生成 .html → 归档副本 → 跑部署脚本上传 → commit &amp; push</p>
</blockquote>
<hr/>
<h2 id="v193-2026-08-10">📌 v1.9.3 增补说明(2026-08-10 早班巡检触发) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>🔴 P0-1 <code>/itportal/</code> 实测已闭环</strong>08-03 nginx 配置清理(line 139-142 明确注释)已部署生效,今日公网 <code>curl /itportal/</code> 实测 = <strong>HTTP 404</strong>(之前 500 是 rewrite cycle bug,现已不存在)。<strong>bug 已修复</strong>,但看板标"待部署"是 08-06 旧观察结果 → 迁移至"已完成"区(2026-08-03</li>
<li><strong>dida365 双向校验发现 4 处脱节</strong><br/>
1. ❗ <code>6a6bfc2be4b03a0a8af7f702</code> [P1 sensitive_words 13 端点补 auth] — 看板 08-04 已完成 + 08-08 自动同步描述,但 <strong>dida status=0 / completedTime=null</strong> 实际仍 active;本次同步 close<br/>
2. ❗ <code>6a705109e4b03a0a8b2eca2a</code> [P1 Alembic 迁移脱节 053-057] — dida P1 区有,<strong>看板缺失</strong> → 补登<br/>
3. ❗ <code>6a70510fe4b0fe2f03126d3c</code> [P1 troubleshooting_templates 补 2 索引] — dida P1 区有,<strong>看板缺失</strong> → 补登<br/>
4. ❗ <code>6a752de4e4b01cac6d28e0e2</code> [风险 Nginx /h5/ alias+try_files 易循环 500 隐患] — dida 有,<strong>看板缺失</strong> → 补登</li>
<li><strong>console.{log,debug,info} 残留 128 → 129</strong>h5 不变(101) / agent 17→20useScreenCapture/useWebSocket 新增 3 处)/ terminal 7→8useWebSocket.ts 新增 1 处)= <strong>129 行</strong></li>
<li><strong>BLK-A/B 26 → 30 天阈值</strong>2026-07-11 → 2026-08-10 = 30 天,看板标注滞后</li>
<li><strong>新增治理项</strong><br/>
1. <code>[P0-NEW10]</code> 后端 debug 端点全清单(test-ping/test-error/health/ready/metrics/version/openapi.json)生产暴露治理 — P0 区<br/>
2. <code>[P1 治理-2]</code> 看板-滴答双重脱节闭环 — P1 区(dida <code>6a76a809e4b01cac6d3c5ac0</code> 升级为 P1 治理-2 持续跟进)<br/>
3. <code>[P1 治理-3]</code> 看板-滴答清单反向同步机制(dida→看板) — P1 区(发现看板有项未入 dida 的反向脱节)</li>
<li><strong>dida 同步动作</strong></li>
<li>close <code>6a6bfc2be4b03a0a8af7f702</code>sensitive_words 13 端点,状态 0→2completedTime 2026-08-10 01:25 UTC</li>
<li>看板-滴答清单双向同步铁律扩展:dida→看板反向同步同样纳入铁律</li>
</ul>
<h2 id="_2">📊 看板概览 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>状态</th>
<th>数量</th>
<th>变化</th>
</tr>
</thead>
<tbody>
<tr>
<td>🔴 P0 必做</td>
<td>1</td>
<td>持平(<strong>P0-NEW8 host vs git 仓库结构差异</strong>NEW9/10/11/12 全部闭环维持;P0-3/P0-4/P0-5 全部闭环已部署)</td>
</tr>
<tr>
<td>🟡 P1 重要</td>
<td>6</td>
<td>持平(P1-1.1 二次治理 console 129 行<strong>已逾期 1 天</strong> + 治理-1/2/3 + Alembic 已逾期 4 天 + Idx 已逾期 6 天)</td>
</tr>
<tr>
<td>🟢 等用户决策</td>
<td>2</td>
<td>持平(<strong>33 天阈值</strong>08-13 自 07-11 已 33 天;从 v1.9.7 标 32 天修正)</td>
</tr>
<tr>
<td>🟠 进行中</td>
<td>1</td>
<td>持平(#81 敏感词检测 v1.1 阶段1 已完成,v1.2 待排期)</td>
</tr>
<tr>
<td>🏷️ 看板治理</td>
<td>3</td>
<td>持平</td>
</tr>
<tr>
<td>🟡 待开始</td>
<td>0</td>
<td>持平</td>
</tr>
<tr>
<td>⏸️ 暂停</td>
<td>5</td>
<td>持平(安全策略检查平台 REQ-集成-001)</td>
</tr>
<tr>
<td>✅ 已完成</td>
<td>103</td>
<td>持平</td>
</tr>
<tr>
<td>⚠️ 风险项</td>
<td>1</td>
<td>持平(Nginx /h5/ alias+try_files 潜伏 500 隐患 dida <code>6a752de4</code> 已逾期 2 天;公网版本停滞 3 天已解除 08-12,但 08-13 09:00 起重新计算停滞窗口 ~14h)</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="p0-high-priority">🔴 P0 必做(高优先级 / High Priority <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>立即推进,需当日 / 次日完成。分类说明:<br/>
<strong>🆕 新增</strong> = 本次巡检首次发现;<strong>♻️ 历史遗留</strong> = 已记录但未关闭;<strong>🔥 紧急</strong> = 影响用户可感知功能或多端点</p>
</blockquote>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>类别</th>
<th>阻塞时长</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>P0-3</strong></td>
<td><code>closing_service.py:467</code> datetime 时区错位</td>
<td>♻️ 历史遗留</td>
<td><strong>8 天</strong>(自 2026-08-03</td>
<td>✅ 已修复</td>
<td db:ok_="db:ok," redis:ok="redis:ok"><strong>2026-08-11 16:08 预生产部署闭环</strong><code>from datetime import datetime, timedelta, timezone</code> + 行 467 <code>elapsed = datetime.now(timezone.utc) - close_time</code>2 行改动)。<strong>端到端验证</strong>jumpserver-V2 直接调 <code>ClosingService.reopen_conversation("sxn", "61ba5bbb-...")</code> → 报 <code>AppException 已超过 24 小时重开窗口</code>(预期行为,原 TypeError 已消失)。dida <code>6a72c892</code> 已 completed 对齐(completedTime 2026-08-11 08:13:52 UTC)。建议后续审计同文件行 658/673/687 同模式(<code>datetime.now() - timedelta(...)</code> 与 SQL 列比较),本次未动(未触发报错,但同坑潜在)。<strong>部署链路</strong>:① 备份 <code>/opt/wecom-it-desk/app/{main.py,services/closing_service.py,services/employee_profile_service.py}.bak-p03p04-20260811160814</code> ② cp 覆盖 + chown 197609:197609 ③ <code>docker restart wecom_it_backend</code><code>Up 18 seconds (healthy)</code> ④ /health 200 OK + /ready 200 OK</td>
</tr>
<tr>
<td><strong>P0-4</strong></td>
<td><code>employee_profile_service.py:236</code> SessionLocal NoneType 🔥</td>
<td>🆕 位置修正</td>
<td>&lt;1 天</td>
<td>✅ 已修复</td>
<td><strong>2026-08-11 16:08 预生产部署闭环</strong>:① <code>app/main.py</code> lifespan 加 <code>from app.models.base import get_session_local; get_session_local()</code> 强制初始化(1 行 startup)② <code>employee_profile_service.py:236</code> <code>db = SessionLocal()</code><code>db = get_session_local()()</code>(1 行代码改动)。双拦:startup 兜底 + 调用方主动走懒初始化触发器。<strong>端到端验证</strong>jumpserver-V2 直接调 <code>get_employee_profile_service().get_profile_dict("sxn")</code> → 实例化成功 + 返回 dict(外部 API 空)。dida <code>6a7ad5f0</code> 已补建+completed 对齐(completedTime 2026-08-11 08:13:58 UTC)。<strong>部署链路</strong>:同 P0-3 共享 <code>bak-p03p04-20260811160814</code></td>
</tr>
<tr>
<td><strong>P0-5</strong></td>
<td>容器 <code>app/constants/</code> 打包错误 🔥</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>✅ 已关闭(描述失真)</td>
<td><strong>2026-08-11 15:30 复核</strong>:磁盘实测 <code>src/backend/app/constants/</code> 结构正确——<code>__init__.py</code> (1109B) = package 入口 re-export <code>from app.constants.automation import *</code><code>automation.py</code> (11635B) = 真正常量模块;Glob 确认无遗留单文件 <code>app/constants.py</code> / <code>app/automation.py</code><strong>两者并未互换</strong>,属正常的 package 入口+子模块结构。看板描述可能是早期症状(部署前 build 报错)的过时快照,与现状脱节。<strong>关闭说明</strong>:自动化常量已正确 package 化,2026-08-11 实测确认。dida 无对应任务,无需同步关闭</td>
</tr>
<tr>
<td><strong>P0-6</strong></td>
<td>后端 OAuth 40029 抖动(用户码失效)</td>
<td>️ 信息类</td>
<td>持续</td>
<td>🟢 已知噪声</td>
<td>218.75.34.87 等外部 IP 持续试探 <code>/api/auth/validate-sso</code> + 偶发 OAuth code 失效。属 WAF 扫描背景噪声,已 fail2ban 监控。无需主动处理</td>
</tr>
<tr>
<td><strong>P0-NEW7</strong></td>
<td>看板-部署脱节:nginx <code>/docs/</code> 路由缺失</td>
<td>✅ 已修复</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-06 11:46 已完成</strong>:① docker-compose.yml 加 <code>docs-public</code> 卷挂载 ② nginx.conf 加 <code>location /docs/ { alias /opt/wecom-it-desk/docs-public/; charset utf-8; add_header Cache-Control "no-cache, must-revalidate"; ... }</code><code>docker compose up -d --force-recreate nginx</code> + <code>nginx -t</code> + <code>nginx -s reload</code><strong>jumpserver-V2 实测</strong>:容器内 <code>curl -sI http://127.0.0.1/docs/kanban/项目状态看板.html</code><strong>200</strong>30765BCache-Control no-cache)。外部 URL <code>https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html</code> 实测完整渲染 v1.9.0-FROZEN 内容 ✓</td>
</tr>
<tr>
<td><strong>P0-NEW8</strong></td>
<td>host 文件结构 vs git 仓库结构差异</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>🔴 待修复</td>
<td><strong>2026-08-06 11:46 P0-NEW7 修复期间发现</strong>:本地 git 仓库结构是 <code>src/backend/</code>,主机实际结构是 <code>app/</code>admin:admin, Aug 3),两者不一致。<code>docker-compose.yml</code><code>backend.context: ./src/backend</code> + <code>./src/backend/app:/app/app</code> 在主机上不存在对应目录,导致 <code>docker compose up -d --force-recreate backend</code> 时挂载空目录、容器内 <code>/app/app</code> 为空、uvicorn 找不到 <code>app.main</code>、启动失败。<strong>临时回退</strong>docker-compose.yml 改 <code>context: ./backend</code> + <code>- ./app:/app/app</code> 适配主机,backend 容器已恢复。但长期需要:① 决定 host 是否同步 git 仓库 ② 是否启用 build context 镜像构建 ③ 迁移路径方案评估</td>
</tr>
<tr>
<td><strong>P0-NEW9</strong></td>
<td>main.py 调试端点(test-ping/test-error)生产暴露</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-08 06:00 早班巡检发现</strong>src/backend/app/main.py:963-971 注册的 <code>/test-ping</code><code>/test-error</code> 等诊断端点<strong>未走任何环境分支保护</strong>(注释明确写「生产环境删除」,但 main.py <code>_is_dev_mode()</code> 仅作用于 :932 周边)。<strong>v1.9.3 公网实测(2026-08-10 09:00</strong><code>GET https://itsupport.servyou.com.cn/api/test-ping</code> 仍返 200 OK 含 <code>"pong"</code> — 仍未修复。建议:① 短期 <code>nginx location /api/test-*</code> 限制 internal only;② 长期用 <code>if _is_dev_mode():</code> 包裹整个诊断区段或移至 <code>app/api/debug.py</code> 仅 dev 加载。伴随项:建议同步治理 <code>/api/openapi.json</code> 312 端点公开(含 106 admin + 29 auth)。<strong>2026-08-11 14:00 闭环</strong>nginx 边缘层 <code>location ~ ^/api/(test-|debug/) { return 404; }</code> 已部署预生产并复测 <code>/api/test-ping</code><code>/api/test-error</code> 公网 404<code>/api/health</code><code>/api/ready</code> 仍 200 无误伤。详见 <code>docs/06-安全审计/01-审计报告/SEC-P0-NEW9-10-调试端点暴露风险确认与应对方案-2026-08-11.md</code>。代码层根因(移 debug.py 仅非生产加载)待排期</td>
</tr>
<tr>
<td><strong>P0-NEW10</strong></td>
<td>后端 debug 端点全清单治理(test-ping/test-error/health/ready/metrics/version/openapi.json</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-10 09:00 早班巡检发现</strong>P0-NEW9 仅涉及 <code>/test-ping</code> + <code>/test-error</code> 两个端点,但 <code>src/backend/app/main.py</code> 实际注册的诊断端点全集更广——line 978 <code>@app.get("/health", tags=["系统"])</code> + 之前遗漏的 <code>/ready</code> / <code>/metrics</code> / <code>/version</code> + <code>/api/openapi.json</code>FastAPI 默认开放,312 端点全公开)。<strong>v1.9.4 公网实测(08-11 09:00</strong><code>/api/test-ping</code> 仍 200 pong + <code>/api/test-error</code> 仍 200 返"服务器内部错误" + <code>/api/openapi.json</code> 仍 200 OK 424122B。建议批量治理:① <code>app/api/debug.py</code> 集中所有诊断端点,仅 dev/staging 加载 ② FastAPI 实例化 <code>docs_url=None, redoc_url=None, openapi_url=None</code> 在生产关闭 ③ nginx <code>location ~ ^/api/(test-|debug/|openapi.json)</code> return 404 外部。<strong>2026-08-11 14:00 闭环</strong>nginx 边缘层对 <code>/api/test-ping</code><code>/api/test-error</code><code>/api/metrics</code><code>/api/version</code> 返回 404(公网复测确认);<code>/api/health</code><code>/api/ready</code> 保留供探针(仍 200);<code>/api/openapi.json</code> 由 P0-NEW11 已闭环。与 P0-NEW11 同源双拦(代码层 app_env 判定 + nginx 兜底)。详见 <code>docs/06-安全审计/01-审计报告/SEC-P0-NEW9-10-调试端点暴露风险确认与应对方案-2026-08-11.md</code></td>
</tr>
<tr>
<td><strong>P0-NEW11</strong></td>
<td>/api/openapi.json 生产公开 312 端点治理(攻击者字典级暴露)</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-11 09:00 早班巡检实测</strong><code>curl -sI https://itsupport.servyou.com.cn/api/openapi.json</code> → 200 OK 424122B<strong>完整 API 字典</strong>含 106 admin + 29 auth 端点)。<strong>2026-08-11 已闭环(双拦 + 公网复测证据)</strong>:① 代码层 <code>create_app()</code><code>settings.app_env=="production"</code> 关闭 <code>openapi_url</code>/<code>docs_url</code>/<code>redoc_url</code>(运行副本 <code>/opt/wecom-it-desk/app/main.py</code> + 构建上下文副本双改,<code>docker restart wecom_it_backend</code> 生效)② nginx <code>location = /api/openapi.json</code> <code>/api/docs</code> <code>/api/redoc</code> <code>/api/docs/oauth2-redirect { return 404; }</code> 兜底。复测:容器内 <code>/openapi.json</code>→404、<code>/docs</code>→404、<code>/redoc</code>→404;公网 <code>/api/openapi.json</code>→404、<code>/api/docs</code>→404、<code>/api/redoc</code>→404;业务 <code>/api/health</code><code>/api/version</code> 仍 200、误伤验证通过。详见 <code>deliverables/openapi_exposure_report.md</code></td>
</tr>
<tr>
<td><strong>P0-NEW12</strong></td>
<td>应用层 debug 端点代码层根因(容器内 /test-ping /test-error /version 仍 200,仅 nginx 边缘层兜底 404</td>
<td>🆕 新增</td>
<td>🆕</td>
<td>✅ 已修复</td>
<td><strong>2026-08-12 10:30-10:55 修复完成</strong>(公网 + 容器内 12+6 端点验证全 4xx):① 新建 <code>src/backend/app/api/debug.py</code> 集中 3 个调试端点(<code>/api/debug/ping</code>+<code>/error</code>+<code>/version</code>)② main.py 删除散落 <code>/test-ping</code> <code>/test-error</code> <code>/version</code>,改为 <code>if _is_dev_mode():</code> 块内 <code>include_router(debug_router)</code>(双重门控:挂载 + 端点内自校验)③ <strong>二次修复 v1.1</strong><code>/test-ping</code> 等未挂载但容器内 <code>/api/debug/ping</code> 仍 200——根因为预生产服 <code>APP_ENV=production</code> + <code>DEV_MODE=true</code> 配置不一致,原 <code>_is_dev_mode()</code> 把 DEV_MODE 优先级置顶;改为 <code>app_env 优先</code> 后 production 永远 False。同步修复 main.py + dev_auth.py + conftest.pyenable_dev_mode fixture 设 APP_ENV=development)。④ 11 用例回归测试 10 passed + 1 skippedpsutil 缺包)。<strong>v1 部署 10:48</strong> + <strong>v2 部署 10:55</strong>jumpserver-V2 PSFTP + docker restart)。<strong>部署后 12 端点公网验证</strong>:3 旧端点 404 + 3 新端点 404 + 3 dev 403nginx IP 白名单)+ 1 health 200 + 3 P0-NEW11 404。<strong>容器内直测 6 端点 100% 4xx</strong>(用户原话真实风险场景)。详见 <code>docs/03-测试文档/05-缺陷单/BUG-安全-005-调试端点无门控-001.md</code></td>
</tr>
</tbody>
</table>
<p><strong>滴答清单跟踪</strong>P0 系列已在滴答清单 <code>wecom_it_smart_desk</code> 项目下建任务(标签 <code>work</code>)。<strong>v1.9.4 闭环同步(2026-08-11 14:28 复验)</strong><br/>
- <code>6a76a80de4b050c704916c07</code> [P0-NEW9] /api/test-ping 生产暴露调试端点治理(main.py 未走 env 分支)— dida 已 completed 对齐(completedTime 2026-08-11 06:28 UTC,与看板「✅ 已修复」闭环一致)<br/>
- T11 = <code>6a7928a2e4b068980437bb15</code> [P0-NEW10] debug 端点全清单治理(test-ping/test-error/health/ready/metrics/version/openapi.json)— dida 已 completed 对齐(completedTime 2026-08-11 06:28 UTC,与看板「✅ 已修复」闭环一致)<br/>
- <code>6a7a7ae6e4b068a058339f6e</code> [P0-NEW11] /api/openapi.json 312 端点治理 — dida 已 completed 对齐(completedTime 2026-08-11 04:24 UTC,与看板闭环一致)<br/>
- <code>6a6bfc2be</code> [P1 sensitive_words 13 端点补 auth] 看板已完成 → dida 同步 closecompletedTime 2026-08-10 01:25 UTC<br/>
- <code>6a72c892e4b08d42854aa7cf</code> [P0-3] closing_service 时区错位修复(<strong>2026-08-11 16:08 已部署预生产 + dida completed</strong> 对齐,completedTime 2026-08-11 08:13:52 UTC<br/>
- <code>6a7ad5f0e4b01cac6d71dfbf</code> [P0-4] employee_profile ServiceLocal NoneType 修复(<strong>2026-08-11 16:08 已部署预生产 + dida completed</strong> 对齐,completedTime 2026-08-11 08:13:58 UTC</p>
<p><strong>P0-1 闭环</strong>:看板 P0-1 <code>/itportal/</code> 500 修复闭环 — nginx.conf line 139-142 已显式注释"/itportal/ 静态前端块已移除 (2026-08-03 fix)",今日公网实测 500→404rewrite cycle 消失)。迁移至"✅ 最近完成"区。</p>
<hr/>
<h2 id="p1-medium-priority">🟡 P1 重要(待办 / Medium Priority <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>类别</th>
<th>来源</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>P1-1.1</strong></td>
<td>二次清理前端 console.{log,debug,info} 残留 <strong>129 行</strong></td>
<td>🆕 看板-现实脱节</td>
<td>2026-08-10 早班巡检</td>
<td>看板 v1.9.1 P1-1 已关闭「208 行 console 清理」,但 2026-08-08 / 08-10 连续两次巡检实测 <code>src/frontend-{h5,agent,admin,terminal}/src/</code> 仍残留 129 行(h5:101 / agent:20 / admin:0 / terminal:8)。<strong>变化点</strong>agent 17→20useScreenCapture/useWebSocket 新增 3 处,源自 5311a52 合并)+ terminal 7→8useWebSocket.ts 新增 1 处)。dida task id = <code>6a76a802e4b06898041f5215</code>due 2026-08-12</td>
</tr>
<tr>
<td><strong>P1 治理-1</strong></td>
<td>看板-滴答双源同步机制(看板→dida 方向)</td>
<td>🆕 治理</td>
<td>2026-08-08 早班巡检</td>
<td>08-08 已自动同步 3 项历史不一致。dida task id = <code>6a76a809e4b01cac6d3c5ac0</code>due 2026-08-15</td>
</tr>
<tr>
<td><strong>P1 治理-2</strong></td>
<td>看板-滴答双重脱节闭环(dida→看板 方向)</td>
<td>🆕 治理</td>
<td>2026-08-10 早班巡检</td>
<td><strong>08-10 双向校验发现 4 处 dida→看板 反向脱节</strong>:① <code>6a6bfc2be</code> sensitive_words 13 端点 — 看板已完成,dida 仍 status=0(本次同步 close)② <code>6a705109</code> Alembic 迁移脱节 053-057 — dida P1,看板无 ③ <code>6a70510f</code> troubleshooting_templates 补 2 索引 — dida P1,看板无 ④ <code>6a752de4</code> Nginx /h5/ alias+try_files 潜伏 500 隐患 — dida 风险项,看板无。dida task id = <code>6a76a809e4b01cac6d3c5ac0</code> 升级为 P1 治理-2 持续跟进</td>
</tr>
<tr>
<td><strong>P1 治理-3</strong></td>
<td>看板-滴答清单反向同步机制(dida→看板)</td>
<td>🆕 治理</td>
<td>2026-08-10 早班巡检</td>
<td>发现看板有项未入 dida 的反向脱节。需要把反向同步纳入铁律:早班巡检必须双向同步,dida→看板方向不能漏。后续建议在 <code>scripts/build_kanban_html.py</code><code>--dida-sync</code> 子命令</td>
</tr>
<tr>
<td><strong>P1-Alembic</strong></td>
<td>【dida 补登】治理 Alembic 迁移脱节 — 一次性跑完 053-057 五个迁移(生产 alembic_version 当前=052_diag_queue_quiz</td>
<td>🆕 看板缺失项</td>
<td>2026-08-10 早班巡检反向脱节发现</td>
<td>dida task id = <code>6a705109e4b03a0a8b2eca2a</code>columnId=P1,原 due 2026-08-09 已逾期 1 天。本看板发现前未纳入追踪</td>
</tr>
<tr>
<td><strong>P1-Idx</strong></td>
<td>【dida 补登】troubleshooting_templates 补 2 索引 — idx_tpl_category / idx_tpl_activeH5 列表 WHERE category 性能优化)</td>
<td>🆕 看板缺失项</td>
<td>2026-08-10 早班巡检反向脱节发现</td>
<td>dida task id = <code>6a70510fe4b0fe2f03126d3c</code>columnId=P1,原 due 2026-08-07 已逾期 3 天</td>
</tr>
<tr>
<td><strong>P1-治理-sens</strong></td>
<td>[看板 08-04 已完成 → dida 同步] sensitive_words.py 13 端点补 require_admin</td>
<td>✅ 看板已完成</td>
<td>2026-08-10 早班巡检</td>
<td>看板"最近完成"区已有(2026-08-04),但 dida <code>6a6bfc2be</code> 仍 status=0;本次同步 closecompletedTime 2026-08-10 01:25 UTC</td>
</tr>
</tbody>
</table>
<blockquote>
<p>P1-1(看板 v1.9.1 已关闭项)保留作为历史记录,二次治理由 P1-1.1 承担。</p>
</blockquote>
<hr/>
<h2 id="awaiting-decision">🟢 等用户决策(阻塞项 / Awaiting Decision <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>均超 3 天阈值,需 PM 升级催办。<strong>v1.9.4 阈值校正</strong>30 天 → <strong>31 天</strong>2026-07-11 → 2026-08-11</p>
</blockquote>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>阻塞时长</th>
<th>卡点 / Owner</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>BLK-A</strong></td>
<td>企微会议室 Secret</td>
<td>⚠️ <strong>31 天</strong>(自 2026-07-11</td>
<td>需企业微信管理后台申请 / Owner: 平台组</td>
<td>影响会议室预定功能 / <code>/itterminal/</code></td>
</tr>
<tr>
<td><strong>BLK-B</strong></td>
<td>ITSM API 授权</td>
<td>⚠️ <strong>31 天</strong>(自 2026-07-11</td>
<td>需向 ITSM 平台方申请 app_id/app_secret / Owner: 平台组</td>
<td>影响 ITSM 工单卡片跳转</td>
</tr>
</tbody>
</table>
<p><strong>催办机制</strong>:建议 PM 每周一 review(滴答清单循环任务)。dida task <code>6a7008e9e4b03a0a8b2870ba</code> (BLK-A) + <code>6a7008e9e4b06440c396f6c2</code> (BLK-B)due 已逾期(2026-08-07)。</p>
<hr/>
<h2 id="req-001">⏸️ 安全策略检查平台 (REQ-集成-001) — 已暂停 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>#118</td>
<td>火绒API集成</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>复用现有功能,必要性未确认</td>
</tr>
<tr>
<td>#119</td>
<td>联软Excel导入</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>用户-终端关联导入</td>
</tr>
<tr>
<td>#120</td>
<td>数据融合引擎</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>IP/主机名/MAC三级匹配</td>
</tr>
<tr>
<td>#121</td>
<td>策略规则与通知模板</td>
<td>P1</td>
<td>⏸️ 暂停</td>
<td>命中管理、通知发送</td>
</tr>
<tr>
<td>#122</td>
<td>调度执行与导出</td>
<td>P0</td>
<td>⏸️ 暂停</td>
<td>定时任务、Excel导出</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>暂停原因</strong>: 必要性未确认,待进一步评估后再启动</p>
</blockquote>
<p><strong>关联文档保留</strong><br/>
- PRD: <code>01-产品文档/08-集成生态/PRD-REQ-集成-001-OpenClaw合规检查-v1.0.md</code><br/>
- 原型: <code>01-产品文档/08-集成生态/原型-REQ-集成-001-OpenClaw合规检查-v1.0.html</code><br/>
- 技术方案: <code>02-技术文档/技术架构/技术方案-REQ-集成-001-OpenClaw合规检查-v1.0.md</code></p>
<hr/>
<h2 id="in-progress">🟠 进行中 (In Progress) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>状态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>#81</td>
<td>敏感词检测 + 语气优化</td>
<td>P0</td>
<td>🔄 v1.1 阶段1 已完成(07-28</td>
<td>词库入库 + 后台管理 UI(增删改查 + 灰度开关)+ 12 个配套 API 已落地。剩余阶段(语气优化、灰度策略细化)待 v1.2 排期。详见 <code>docs/01-产品文档/00-产品规划/PRD-REQ-通用-004-敏感词检测-v1.2-AI辅助.md</code></td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="to-do">🟡 待开始 (To Do) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>(当前无待开始任务)</td>
<td></td>
<td>#104 已于 2026-08-07 结案并迁入「最近完成」区</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="recently-completed">✅ 最近完成 (Recently Completed) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>负责人</th>
<th>完成日期</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>P1-治理-hand_raise</strong></td>
<td>术语对齐:hand_raise「举手」改名迁移为 human_call「人工呼叫标记」+ 摇人统一 + τ门控/置信度门控区分</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td><strong>2026-08-12 19:1x</strong></td>
</tr>
<tr>
<td><strong>BUG-登录-测试账号面板不显示-002</strong></td>
<td>H5 端"测试账号登录"面板永不显示 + H5 dist 部署路径错配 + dev_auth router prefix 与 nginx proxy_pass 路径冲突(双根因 + 双铁律级落地)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td><strong>2026-08-11 19:30</strong></td>
</tr>
<tr>
<td><strong>BUG-登录-扫码劫持-001</strong></td>
<td>DEV_MODE=true 劫持真实扫码登录(坐席端/管理后台)+ nginx <code>/api/dev/</code> 白名单遗漏公司出口 IP</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td><strong>2026-08-11</strong></td>
</tr>
<tr>
<td><strong>P0-NEW9</strong></td>
<td>/api/test-ping 生产暴露调试端点治理(main.py 未走 env 分支)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td><strong>2026-08-11</strong></td>
</tr>
<tr>
<td><strong>P0-NEW10</strong></td>
<td>后端 debug 端点全清单治理(test-ping/test-error/health/ready/metrics/version/openapi.json</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td><strong>2026-08-11</strong></td>
</tr>
<tr>
<td><strong>REQ-006</strong></td>
<td>预生产测试通道:DEV_MODE + nginx 内网闸门 + 三端测试登录入口</td>
<td>🟢 基建</td>
<td>Duckula</td>
<td><strong>2026-08-11</strong></td>
</tr>
<tr>
<td><strong>PR #6</strong></td>
<td>task-actions-pivot:坐席端 TaskDetailView 操作区主操作+⋯ 收纳</td>
<td>🟡 功能</td>
<td>Duckula</td>
<td><strong>2026-08-11</strong></td>
</tr>
<tr>
<td><strong>P0-1</strong></td>
<td><code>/itportal/</code> 入口 500 错误(nginx rewrite cycle</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td><strong>2026-08-03</strong></td>
</tr>
<tr>
<td>#104</td>
<td>运行期结构化日志查看页(筛选 + 下载命中行)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-07</td>
</tr>
<tr>
<td>-</td>
<td>[P0→P3] 复核 /h5/ HTTP 404(看板 v1.9.1 P0-1 已闭环)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-08</td>
</tr>
<tr>
<td>-</td>
<td>sensitive_words.py 13 端点补 require_admin(看板 08-04 闭环 + dida 08-10 同步 close</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-10</td>
</tr>
<tr>
<td>-</td>
<td>[P0-2] sensitive_words.py 13 端点补 require_admin</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-08</td>
</tr>
<tr>
<td>-</td>
<td>[P1-1] 清理前端 console.log 残留 208 行</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td>2026-08-08</td>
</tr>
<tr>
<td>-</td>
<td>【P1】补齐 Nginx 生产安全响应头(复制 7 个 add_header</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td>2026-08-07</td>
</tr>
<tr>
<td>-</td>
<td>sensitive_words.py 13 端点补 require_admin</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-04</td>
</tr>
<tr>
<td>-</td>
<td>前端 console.log 残留 208 行清理</td>
<td>🟡 P1</td>
<td>Duckula</td>
<td>2026-08-05</td>
</tr>
<tr>
<td>-</td>
<td>/itportal 500 修复(nginx 配置清理)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>-</td>
<td>troubleshooting_templates.py 5 端点补 auth + MOCK 替换 ORM</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>#133</td>
<td>voice_asr.py POST /asr auth 加固(P0 安全巡检)</td>
<td>🔴 P0</td>
<td>Duckula</td>
<td>2026-08-03</td>
</tr>
<tr>
<td>-</td>
<td>批次1 P0重构(超时预算切分/RecommendCard/WS全字段)</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次2 P1基础重构(AIService单例/Dify调用点/Matcher/WS/Redis</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次3 P1核心重构(process管线化/结单确认断链修复)</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>批次4 P2收尾(死代码大扫除)</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>D1合并(双模支持/kfid路由/C7/C8/上下文超限重置)</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-18</td>
</tr>
<tr>
<td>-</td>
<td>文档重组(docs目录9→10类/PRD合并/技术文档关联REQ)</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-19</td>
</tr>
<tr>
<td>#82</td>
<td>H5右侧栏布局调整</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-17</td>
</tr>
<tr>
<td>#76</td>
<td>ITSM工单卡片跳转(桥接页一步直达 + 扫码登录定为人机校验)</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-17</td>
</tr>
<tr>
<td>BUG-AI-001</td>
<td>打印机路由到行政前台 + [object Object]显示异常</td>
<td>P2</td>
<td>Duckula</td>
<td>2026-07-23</td>
</tr>
<tr>
<td>-</td>
<td>H5用户端原型图 v2.0 更新</td>
<td>-</td>
<td>Duckula</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>#124</td>
<td>坐席端接单按钮状态优化</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>#125</td>
<td>H5选项交互消息重复处理</td>
<td>P0</td>
<td>Simon/Duckula</td>
<td>2026-07-24</td>
</tr>
<tr>
<td>BUG-用户-003</td>
<td>H5 员工端"结束会话失败,请稍后重试"修复</td>
<td>P2</td>
<td>Duckula</td>
<td>2026-07-30</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="2026-07-1516">✅ 近期完成 (2026-07-15~16) <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>任务ID</th>
<th>任务名称</th>
<th>优先级</th>
<th>负责人</th>
<th>完成日期</th>
</tr>
</thead>
<tbody>
<tr>
<td>#117</td>
<td>Neo4j 知识图谱连接修复</td>
<td>P0</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#118</td>
<td>粘贴图片边框问题</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#80</td>
<td>企微图片消息无法预览</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-16</td>
</tr>
<tr>
<td>#75</td>
<td>头像同步功能完善</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-15</td>
</tr>
<tr>
<td>#74</td>
<td>IT资产升级卡片免登录修复</td>
<td>P1</td>
<td>宋献</td>
<td>2026-07-15</td>
</tr>
<tr>
<td>#73</td>
<td>H5截图功能</td>
<td>P2</td>
<td>宋献</td>
<td>2026-07-14</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="_3">📌 重要技术决策与限制记录 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<table>
<thead>
<tr>
<th>日期</th>
<th>决策 / 限制</th>
<th>影响范围</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>2026-07-18</td>
<td>D1合并:后端双模支持</td>
<td>H5 AI对话</td>
<td>intent_type/business_category字段透传,主Dify结果直接判断路由</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>kfid路由窗口配置化</td>
<td>H5业务路由</td>
<td>12个职能部门窗口(行政/人力资源/财务/法务/物业),business_contacts表查具体处理人</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>Redis密码轮换</td>
<td>生产环境</td>
<td>新密码32位字母数字,仅存服务器.env,轮换后验证通过</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>process_h5_ai_reply管线化</td>
<td>H5 AI对话</td>
<td>9步骤函数式拆分,try/except 11对→1对</td>
</tr>
<tr>
<td>2026-07-18</td>
<td>结单确认功能断链修复</td>
<td>坐席端</td>
<td>WS类型resolve_confirm,前端case改对应监听+ChatPanel挂载</td>
</tr>
<tr>
<td>2026-07-19</td>
<td>docs目录重组</td>
<td>文档管理</td>
<td>9类→10类(新增运营文档),PRD合并,技术文档关联REQ编号</td>
</tr>
<tr>
<td>2026-07-17</td>
<td>H5 答题功能实现</td>
<td>H5 右侧栏</td>
<td>答题区域通过 showQuiz prop 控制显隐,QueueWaiting 组件始终挂载但默认折叠。修复了答题默认显示和重复出现的 bug。详见任务说明书 #82 v1.1</td>
</tr>
<tr>
<td>2026-07-17</td>
<td>ITSM 工单跳转:扫码登录定为人机校验</td>
<td>8 个运维平台审批卡片</td>
<td>Web ITSM 深链不支持静默企微 OAuth,桥接页跨域预热被拒,仍弹扫码。产品决策保留该扫码环节(企业安全合规可接受的二次身份确认),不视为缺陷。详见 PRD §v2.3、架构 §15.4.9、任务说明书 #76 v3.0</td>
</tr>
<tr>
<td>2026-08-05</td>
<td><strong>看板 v1.8 分区升级</strong></td>
<td>看板管理</td>
<td>新增 🔴 P0 必做 / 🟡 P1 重要 / 🟢 等用户决策三个正式分区,4 维分类(新增/历史遗留/信息/建议)正式纳入看板流转</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>看板 v1.9 看板-现实一致性巡检</strong></td>
<td>看板管理</td>
<td>2026-08-06 06:00 巡检发现 v1.8 中 2 项描述(P0-2 sensitive_words / P1-1 console.log)与现实脱节(代码已修复 / 已清理),v1.9 已迁移至已完成。<strong>新发现</strong>v1.8 顶部"对外发布"声明与现实脱节——nginx 无 <code>/docs/</code> 路由,外部 URL 404。v1.9 修正声明并新增 P0-NEW7(看板-部署脱节治理)。新增治理原则:① 看板冻结前由自动化扫描 P0/P1 条目对应的源码/容器状态 ② 看板顶部"服务发布"声明须配套 curl 实测验证,否则标"已上传服务器,服务状态待验"</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>看板 v1.9 新增治理:自动扫描防脱节</strong></td>
<td>看板管理</td>
<td>未来由 <code>scripts/build_kanban_html.py --check</code> 模式在生成前对每条 P0/P1 描述做源码关键字 / 容器文件存在性校验,避免看板-现实脱节再次发生</td>
</tr>
<tr>
<td>2026-08-06</td>
<td><strong>P0-NEW8host vs git 仓库结构差异</strong></td>
<td>部署架构</td>
<td>P0-NEW7 修复期间触发——本地 git 仓库 <code>src/backend/</code> 与主机实际 <code>app/</code> 结构不一致,docker-compose.yml 路径配置失配引发 backend 容器启动失败。需 PM 决策:① host 是否同步 git 仓库 ② 是否启用 build context 镜像重建 ③ 迁移路径方案</td>
</tr>
</tbody>
</table>
<hr/>
<h2 id="_4">📈 任务统计 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li><strong>总任务数</strong>: 115v1.9.5 114 + P0-NEW12 应用层 debug 端点代码层根因 1 项)</li>
<li><strong>已完成</strong>: 103+1BUG-登录-扫码劫持-001 DEV_MODE 修复 + nginx 白名单;P0-NEW9 / P0-NEW10 / P0-NEW11 / P0-3 / P0-4 已闭环已部署;BUG-002 已闭环入"已完成"区;+1 v1.9.7 P1-治理-hand_raise 闭环)</li>
<li><strong>🔴 P0 必做</strong>: 1<strong>P0-NEW8</strong> host vs git 仓库结构差异;P0-NEW12 v1.1 闭环已部署 2026-08-12 10:55NEW9 / NEW10 / NEW11 / P0-3 / P0-4 / BUG-002 / BUG-001 已闭环已部署;P0-5 描述失真已关闭;P0-1 已闭环;P0-6 已知噪声)</li>
<li><strong>🟡 P1 重要</strong>: 6P1-1.1 已逾期 1 天 / 治理-1 / 治理-2 / 治理-3 / P1-Alembic 已逾期 4 天 / P1-Idx 已逾期 6 天;P1-治理-sens 是 dida close 同步不入待办列)</li>
<li><strong>🟢 等用户决策</strong>: 2BLK-A/B<strong>均超 33 天阈值</strong>08-13 自 07-11 已 33 天)</li>
<li><strong>🟠 进行中</strong>: 1#81 v1.2 待排期)</li>
<li><strong>🟡 待开始</strong>: 0</li>
<li><strong>⏸️ 暂停</strong>: 5(安全策略检查平台)</li>
<li><strong>⚠️ 风险项</strong>: 1(风险-1 Nginx /h5/ alias+try_files 潜伏 500 隐患 dida <code>6a752de4</code> 已逾期 2 天;<strong>风险-2 公网版本停滞 3 天已解除</strong> 08-12 公网实测 /h5/go → v20260811,但 08-13 起重新计算 ~14h</li>
<li><strong>dida365 同步状态</strong>: 2026-08-13 09:00 双向校验一致(无新建/关闭需要)= 7 项 undoneP1-1.1 + 治理-1/2/3 + P1-Alembic + P1-Idx + BLK-A + BLK-B + 风险 /h5/);2026-08-10 01:25 UTC 同步 close 1 项(sensitive_words <code>6a6bfc2be</code>);2026-08-08 03:52 UTC 同步 close 3 项 + create 3 项;<strong>2026-08-11 同步</strong>P0-NEW9/NEW10/NEW11 全部 completed + BUG-002 待补建 dida 任务并 complete<strong>08-12 早班同步触发 P0-NEW12 create</strong>);<strong>16:45 同步:BUG-登录-扫码劫持-001 待补建 dida 任务并 complete</strong><strong>双向同步铁律</strong>:看板→dida 与 dida→看板 均纳入巡检必做项</li>
</ul>
<hr/>
<h2 id="_5">🔗 相关文档 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<ul>
<li>任务说明书目录: <code>docs/07-项目管理/任务说明书/</code></li>
<li>项目管理主文档: <code>docs/07-项目管理/任务说明书/IT智能服务台-项目管理主文档.md</code></li>
<li><strong>2026-08-05 早班巡检报告(HTML</strong>: <code>docs/07-项目管理/巡检报告/2026-08/2026-08-05-早班.html</code></li>
<li>巡检报告归档目录: <code>docs/07-项目管理/巡检报告/</code></li>
</ul>
<hr/>
<h2 id="_6">📝 看板版本变更记录 <a class="back-to-toc" href="#toc" title="回到目录">📑</a></h2>
<blockquote>
<p>模板依据:规范 §4.2 / §8.3 变更记录表(含「变更原因」「影响范围」)</p>
</blockquote>
<table>
<thead>
<tr>
<th>版本</th>
<th>日期</th>
<th>变更内容</th>
<th>变更人</th>
<th>变更原因</th>
<th>影响范围</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>v1.9.8-DRAFT</strong></td>
<td>2026-08-13</td>
<td>早班巡检 6 项实测发现(P0 全闭环维持 / 公网 + 容器内 12 端点 100% 4xx / 容器资源全绿 / P1-1.1 逾期 1 天 / BLK-A/B 33 天阈值 / v1.9.7 14h 未冻结连续合并待审)</td>
<td>Duckula (AI)</td>
<td>2026-08-13 09:00 早班巡检:jumpserver-V2 cache 有效(hostname OK+ 公网 curl + 容器内 12 端点全 4xx 三重实测;无新增 P0;dida 双向校验一致</td>
<td>🔴 P0 持平 1(P0-NEW8 仍存);🟢 阻塞阈值 32→33 天;✅ 已完成持平 103;⚠️ 风险持平 1;新增本日实测发现 6 项</td>
</tr>
<tr>
<td><strong>v1.9.7-DRAFT</strong></td>
<td>2026-08-12</td>
<td>晚间 P1-治理-hand_raise 术语对齐三处存量漂移闭环(hand_raise→human_call + 摇人统一 + τ门控/置信度门控区分 + 14 py 双仓库同步 + 预生产部署 + 35 条存量数据 SQL 迁移)</td>
<td>Duckula (AI)</td>
<td>08-12 晚间突发闭环</td>
<td>✅ 已完成 102→103;总任务 114→115</td>
</tr>
<tr>
<td><strong>v1.9.6-DRAFT</strong></td>
<td>2026-08-12</td>
<td>早班巡检 4 项关键发现(公网版本停滞解除 / P0-NEW12 应用层 debug 端点代码层根因 / 容器全绿 / dida 双向校验)</td>
<td>Duckula (AI)</td>
<td>2026-08-12 09:00 早班巡检:jumpserver-V2 + 公网 curl + 容器内 <code>python urllib</code> 三重实测</td>
<td>🔴 P0 1→2;✅ 已完成 101→102;⚠️ 风险 2→1;总任务 114→115;新增 P0-NEW12</td>
</tr>
<tr>
<td><strong>v1.9.5-DRAFT 增补(晚间 19:30</strong></td>
<td>2026-08-11</td>
<td>BUG-登录-测试账号面板不显示-002 闭环(双根因 + 双铁律级落地:Login.vue 一行 + deploy 路径铁律 + dev_auth prefix + nginx proxy_pass+ 公网 <code>/api/dev/health</code> 真实 dev_mode 响应验证</td>
<td>Duckula (AI)</td>
<td>18:17 用户反馈"用户端老版本"→18:50 双层定位(前端 BUG + 部署路径错配)→19:06 pnpm build + deploy 落空 + 远端 mv 修正 →19:24 dev_auth + nginx 协同修复 + 公网 curl 验证 <code>{code:0, data:{dev_mode:true,...}}</code> →19:30 Git commit <code>e9d10c2d</code> 本地 + 看板 v1.9.5 增补</td>
<td>🆕 新增 BUG-002 缺陷单 + 4 项铁律级落地;总任务 113→114</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 7</strong></td>
<td>2026-08-11</td>
<td>BUG-登录-扫码劫持-001 闭环(DEV_MODE 修复 + nginx <code>/api/dev/</code> 白名单)+ Git commit <code>9e04016b</code> on main + 预生产部署</td>
<td>Duckula (AI)</td>
<td>16:24 用户复核方案 2 治本→16:35 团队协作(工程师寇豆码 IS_PASS:YES + QA严过关 11/11 PASS)→16:38 主理人部署(bind mount 源路径 <code>/opt/wecom-it-desk/app/services/qrcode_service.py</code> + nginx reload + 后端容器重启 24s healthy)→16:45 用户真实企微账号登录坐席端/管理后台通过验证</td>
<td>🔴 P0 仍 1(仅余 NEW8);✅ 已完成 102→103;总任务 112→113;新增 BUG-登录-扫码劫持-001.md + tests/test_qrcode_hijack_fix.py</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 6</strong></td>
<td>2026-08-11</td>
<td>P0-3 / P0-4 预生产部署闭环(jumpserver-V2+ dida 双 complete + kanban HTML 公网发布</td>
<td>Duckula (AI)</td>
<td>16:08 jumpserver-V2 status=201 缓存有效→upload 3 文件→备份 .bak-p03p04-20260811160814→cp 覆盖→docker restart wecom_it_backend→Up 18s healthy;端到端验证 ClosingService.reopen_conversation 报预期 AppException(1007) 而非 TypeErrorget_employee_profile_service() 实例化成功。dida P0-3 <code>6a72c892</code> + P0-4 <code>6a7ad5f0</code> 均 completed08:13:52/58 UTC)。HTML 58187B 公网 200 OK</td>
<td>🔴 P0 仍 1(仅余 NEW8);dida 闭环</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 5</strong></td>
<td>2026-08-11</td>
<td>P0-3 / P0-4 本地修复 + P0-5 描述失真已关闭(disk 实测结构正确)</td>
<td>Duckula (AI)</td>
<td>15:26 用户复核→15:30 三项同时落地:① closing_service.py:467 加 <code>timezone.utc</code>2 行)② main.py lifespan 强制 get_session_local() + employee_profile_service.py:236 改 <code>get_session_local()()</code>(双拦 1+1 行)③ P0-5 描述与磁盘不符,Glob 确认 <code>app/constants/__init__.py</code> (1109B re-export) + <code>app/constants/automation.py</code> (11635B 真模块) 正确</td>
<td>🔴 P0 4→1;待部署清单:P0-3/P0-4 本地已修+未部署;dida P0-3 待部署后 close + P0-4 需补建任务</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 4</strong></td>
<td>2026-08-11</td>
<td>P0-NEW9/NEW10 调试端点闭环(nginx 边缘层 404+ f2fd4fa WIP 已推 Gitea feat 分支</td>
<td>Duckula (AI)</td>
<td>13:58 nginx 边缘层治理复测通过;14:1x 波动网络推送成功(本地 CONNECT 代理 + 6 块拆分)</td>
<td>🔴 P0 6→4;✅ 已完成 100→102feat/task-actions-pivot-v1.8=f2fd4fa 远端落盘</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 3</strong></td>
<td>2026-08-11</td>
<td>P0-NEW11 闭环:应用层关 <code>openapi_url</code>/<code>docs_url</code>/<code>redoc_url</code> + nginx 4 条 <code>return 404</code> 双拦,公网复测三者均 404</td>
<td>Duckula (AI)</td>
<td>早班巡检确认公网 <code>/api/openapi.json</code> 312 端点暴露,修复后复测通过</td>
<td>🔴 P0 7→6;✅ 已完成 99→100;滴答 NEW11 completed</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后)</strong></td>
<td>2026-08-11</td>
<td>PR #6 合并入 maintask-actions-pivot / 坐席端 TaskDetailView 操作区收纳)</td>
<td>Duckula (AI)</td>
<td>Gitea PR #6 经评审合并(绕过单用户审批门禁 405)</td>
<td>✅ 已完成 98→99;总任务 110→111;仍 v20260808(未部署)</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT 增补(午后 2</strong></td>
<td>2026-08-11</td>
<td>REQ-通用-006 预生产测试通道上线(DEV_MODE + nginx 内网闸门 + 三端测试登录)</td>
<td>Duckula (AI)</td>
<td>三端企微 OAuth 无法自动化测试痛点闭环</td>
<td>✅ 已完成 99→100;总任务 111→112</td>
</tr>
<tr>
<td><strong>v1.9.4-DRAFT</strong></td>
<td>2026-08-11</td>
<td>早班巡检 5 项关键发现(版本停滞 / NEW9-10 暴露 / 风险 /h5/ / P0-3 / BLK 阈值)</td>
<td>Duckula (AI)</td>
<td>2026-08-11 09:00 早班巡检实测</td>
<td>🔴 P0 6→7;⚠️ 风险项 1→2;总任务 109→110;新增 P0-NEW11 + 风险-2</td>
</tr>
<tr>
<td><strong>v1.9.3-DRAFT</strong></td>
<td>2026-08-10</td>
<td>早班巡检 4 项发现(P0-1 闭环 / dida 反向脱节 / console 129 / BLK 阈值)</td>
<td>Duckula (AI)</td>
<td>2026-08-10 09:00 早班巡检</td>
<td>🔴 P0 6;🟡 P1 2→5;✅ 已完成 97→98;⚠️ 风险项 0→1</td>
</tr>
<tr>
<td>v1.9.2-DRAFT</td>
<td>2026-08-08</td>
<td>dida365 自动同步 6 项(close 3 / create 3+ 新增 P0-NEW9</td>
<td>Duckula (AI)</td>
<td>2026-08-08 03:52 UTC dida 同步</td>
<td>🔴 P0 5→6;🟡 P1 0→2;✅ 已完成 94→97</td>
</tr>
<tr>
<td>v1.9.1 补录2</td>
<td>2026-08-07</td>
<td>#104 运行期结构化日志查看页结案</td>
<td>Duckula (AI)</td>
<td>2026-08-07 jumpserver 生产实测结案</td>
<td>待开始 0;已完成 93→94</td>
</tr>
<tr>
<td>v1.9.1 补录</td>
<td>2026-08-07</td>
<td>P1 补齐 Nginx 生产安全响应头(7 头)</td>
<td>Duckula (AI)</td>
<td>2026-08-07 安全巡检修复</td>
<td>已完成 92→93</td>
</tr>
<tr>
<td><strong>v1.9.1-FROZEN</strong></td>
<td>2026-08-06</td>
<td>冻结(P0-NEW7 看板-部署脱节已修复)</td>
<td>Simon(审核)</td>
<td>PM 审核通过</td>
<td>归档 <code>项目状态看板-v1.9.1-FROZEN.html</code></td>
</tr>
<tr>
<td><strong>v1.9.0-FROZEN</strong></td>
<td>2026-08-06</td>
<td>冻结 v1.9-DRAFT(修正服务发布声明脱节)</td>
<td>Simon(审核)</td>
<td>PM 审核通过</td>
<td>归档 v1.9.0-FROZEN;新增 P0-NEW8</td>
</tr>
<tr>
<td>v1.9.0-DRAFT</td>
<td>2026-08-06</td>
<td>草稿(P0 必做 / P1 重要 / 等决策分区重构 + 计数)</td>
<td>Duckula (AI)</td>
<td>看板结构升级</td>
<td>总任务数 96→99</td>
</tr>
<tr>
<td><strong>v1.8.0-FROZEN</strong></td>
<td>2026-08-05</td>
<td>冻结 v1.8-DRAFT</td>
<td>Simon(审核)</td>
<td>PM 审核通过</td>
<td>归档 v1.8.0-FROZEN(声明脱节待 P0-NEW7 修正)</td>
</tr>
<tr>
<td>v1.8-DRAFT</td>
<td>2026-08-05</td>
<td>草稿(新增 3 分区 + 4 维分类)</td>
<td>Duckula (AI)</td>
<td>看板分区重构</td>
<td>总任务数 92→96</td>
</tr>
<tr>
<td>v1.7</td>
<td>2026-08-03</td>
<td>#81 状态反转 + 今日完成项入库</td>
<td>Duckula (AI)</td>
<td>阶段状态更新</td>
<td>统计 92/87/1/1/5/2</td>
</tr>
<tr>
<td>v1.5</td>
<td>2026-07-30</td>
<td>BUG-用户-003 修复完成</td>
<td>Duckula (AI)</td>
<td>2026-07-30 修复</td>
<td>总任务 90→91;已完成 84→85</td>
</tr>
<tr>
<td>v1.4</td>
<td>2026-07-24</td>
<td>批量完成项入库(批次1-4 / D1 / 文档重组 / #124 / #125</td>
<td>Simon</td>
<td>2026-07-24 收编</td>
<td>多任务迁入完成区</td>
</tr>
</tbody>
</table>
</main>
<footer>
本页面由 <code>build_kanban_html.py</code> 自动生成于 2026-08-13 09:19 (GMT+8) · 数据源:docs/07-项目管理/项目状态看板.md<br>
修改流程:编辑 .md → 跑脚本生成 .html → (可选)部署到 jumpserver → commit & push
</footer>
</div>
</body>
</html>