chore: rebuild CentOS 7 release package

This commit is contained in:
shiyue
2026-08-16 22:20:00 +08:00
parent 93641df1ad
commit 6ed8c7d30b
21 changed files with 2137 additions and 45 deletions

View File

@@ -0,0 +1,73 @@
# Findings & Decisions: Goal 气泡显示修复
## Requirements
- `/goal <目标>` 原文应显示为正常用户气泡,而不是居中大系统面板。
- “正在同步 Goal”只承担进度反馈不应长期占据消息区。
- 成功反馈不重复回显完整目标正文。
- 修复后刷新会话仍能看到 Goal 用户气泡。
- 不改变 `/goal` 的 app-server RPC、后台 Goal 执行及其他 Slash 命令语义。
## Research Findings
- `home-cc-web` 代码索引状态为 `ready`,当前包含 6208 个节点、14249 条边。
- `sendMessage()` 明确跳过所有已知 Slash 命令的用户气泡。
- `handleCodexAppGoalSlashCommand()` 将同步与结果统一发送为 `system_message`
- `createMsgElement('system')` 使用 `textContent`,不会渲染 Markdown。
- 通用系统消息 CSS 使用居中、最大宽度 90%、`white-space: pre-line`,长 Goal 会成为大面板。
- 暗金荒野主题把 `.msg.system` 与助手气泡共享磨砂规则,进一步强化面板感。
- 现有回归明确断言 `Goal active``system_message`,需要随新契约更新。
- 用户气泡入口是 `submitUserMessage()`;服务端普通消息入口是 `handleMessage()`,需在这两个边界间设计只用于展示的 Goal 持久化,避免再次调用普通模型链路。
- `submitUserMessage()` 会乐观插入用户气泡、增加当前消息计数并启动生成状态,但发送时没有携带前端生成的 `messageId`
- `handleMessage()` 的普通路径会先把用户消息推入 `session.messages``saveSession()`,随后才进入 Codex App/Claude/Codex 运行时;因此不能直接复用整个普通路径来保存 Goal否则会把 `/goal` 再发送给模型。
- 会话持久化清洗会保留消息对象的额外元数据字段,可为 Goal 展示消息增加明确标记而不改底层序列化框架。
- WebSocket 在进入 `handleMessage()` 前先调用 `handleSlashCommand()`;已知 `/goal` 因此完全绕过普通消息持久化。
- 前端已经支持服务端 `session_message` 事件,可把服务端持久化的 Goal 展示消息追加到当前会话与缓存。
- 代码中已有 `ccwebDisplayOnly: true` 的持久消息先例,适合标识不应被当作真实模型输入的 UI 展示记录。
- 目标业务文件 `public/app.js``server.js``public/style.css``scripts/regression.js` 在本任务开始时没有未提交差异。
- `session_message` 会把服务端消息同时追加到会话缓存和当前 DOM并正常递增消息索引因此 Goal 路径无需前端乐观插入,可由服务端持久化后立即推送,避免双气泡。
- 前端将为设置型 `/goal` 额外发送稳定 `clientMessageId`,同时保留 Slash 草稿用 `requestId`;服务端以前者优先作为展示消息 ID。
- Goal 展示消息正文只保存 `command.objective`,不重复展示 `/goal` 前缀、`Goal active` 标头或状态统计。
- Slash 草稿在收到首个 `system_message` 时就会被移除;当前有效 `/goal` 的“正在同步”已清掉草稿,因此后续 RPC 错误实际上无法再恢复原输入。新契约将把校验失败保留在持久化前RPC 启动后的失败明确保留气泡且不恢复草稿。
- 现有集成回归只断言 `/goal` 不作为普通 `/goal...` 文本持久化;可替换为“目标正文作为 `ccwebDisplayOnly` Goal 用户消息持久化,同时后台 Goal 输出仍正常”。
- 回归入口是 `npm run regression`,没有现成 Goal 专项参数;执行时需用 60 秒超时保护。
- Mock app-server 的 `thread/goal/set` 会生成独立 `Goal background output` turn可用“重复命令 ID 后没有第二个 Goal 背景输出”证明去重没有再次调用 Goal RPC。
- 实现后服务端在 Goal RPC 前持久化并推送 `session_message`,前端沿用普通 `buildMsgElement()` 用户角色渲染;成功/同步系统提示均已改为 transient成功文案不再包含 objective。
- 同一 `clientMessageId` 再次提交会返回短暂“Goal 设置请求已处理”,不会追加消息或触发第二个背景 turn。
- `node --check public/app.js server.js scripts/regression.js``timeout 60s npm run regression` 均通过。
- PM2 `ccweb` 当前监听 `8002`,静态 `app.js` 已能返回新的 `isGoalSetCommandText``clientMessageId`;按仓库约束未重启,因为另有 `/home/cc-web` 运行会话。
- 当前环境没有 `playwright``puppeteer` 或 Chromium 可执行文件,无法完成真实浏览器截图/多视口像素验收;需在有浏览器的环境补做。
- 实施期间另一个 `/home/cc-web` 会话在 `public/app.js``scripts/regression.js` 写入了侧栏折叠改动;这些非 Goal 差异未回滚,当前回归在其共存状态下通过。
## Technical Decisions
| Decision | Rationale |
|----------|-----------|
| 设置型 Goal 显示为用户气泡 | 这是用户提交的长文本,符合对话视觉语义 |
| Goal 进度和成功仍走系统反馈,但设为 transient | 保留操作反馈,不制造持久大块内容 |
| 持久化必须由服务端显式记录展示消息 | 仅前端乐观插入会在刷新后消失 |
| 控制型 `/goal` 命令不显示长用户气泡 | pause/resume/clear/show 是控制操作,保持精简 |
| 使用独立 Goal 展示消息 helper | 直接写入本地历史并推送 `session_message`,绝不复用会继续进入运行时的 `handleMessage()` |
| 每条 Goal 展示消息带稳定 ID 与专用元数据 | 支持传输去重、刷新识别和负向回归断言 |
| 有效设置命令在 RPC 前持久化RPC 失败保留气泡 | 提供即时可见记录;失败后不恢复已提交正文,避免重试产生重复气泡 |
## Issues Encountered
| Issue | Resolution |
|-------|------------|
| 根目录已有其他任务规划与 TODO 文件 | 使用独立 `.planning/2026-08-16-goal-bubble-rendering/`,不改 `.planning/.active_plan` |
| 首轮计划未明确独立持久化、去重和失败边界 | 按审查意见补充 display-only Goal 消息、稳定命令 ID、禁止普通运行时与分阶段失败语义 |
## Resources
- `public/app.js`Slash 发送、系统消息与用户气泡渲染
- `server.js`Goal RPC、会话消息持久化
- `public/style.css`:系统消息与暗金荒野主题样式
- `scripts/regression.js`Codex App Goal 集成回归
## Visual/Browser Findings
- 用户截图中顶部“正在同步 Goal...”为尺寸正常的短系统提示。
- 完成后 `Goal active + 完整目标` 被渲染为居中、接近消息区宽度的大块磨砂面板。
- 长正文包含多行约束与反引号,居中排版和纯文本渲染明显降低可读性。
- 目标视觉应为右侧普通用户气泡;状态反馈应保持短小,不重复正文。

View File

@@ -0,0 +1,112 @@
# Progress Log: Goal 气泡显示修复
## Session: 2026-08-16
### 阶段 1建立现状基线并固化 Goal 交互契约
- **Status:** complete
- **Started:** 2026-08-16
- Actions taken:
- 读取主题、文件规划和 TODO CSV 技能说明。
- 执行规划会话恢复检查,未发现需恢复的输出。
- 记录 Goal 从 Slash 命令到 `system_message` 再到大面板样式的完整原因。
- 固化用户气泡、短暂同步提示、精简成功提示和刷新持久化要求。
- 确认 Slash 路由位于普通消息持久化之前,并找到 `session_message``ccwebDisplayOnly` 复用契约。
- Files created/modified:
- `.planning/2026-08-16-goal-bubble-rendering/task_plan.md`
- `.planning/2026-08-16-goal-bubble-rendering/findings.md`
- `.planning/2026-08-16-goal-bubble-rendering/progress.md`
- `Goal 气泡显示 TO DO list.csv`
### 阶段 2审查实施计划并修正关键缺口
- **Status:** complete
- **Started:** 2026-08-16
- Actions taken:
- 准备独立、无会话历史的计划审查上下文。
- 首轮审查发现独立持久化、去重、失败顺序与负向回归断言不足。
- 已将 display-only Goal 消息、稳定命令 ID、禁止普通模型链路及失败语义写入实施计划。
- 第 2 轮独立审查已通过,无阻断实施的问题。
- Files created/modified:
- `.planning/2026-08-16-goal-bubble-rendering/task_plan.md`
- `.planning/2026-08-16-goal-bubble-rendering/findings.md`
- `.planning/2026-08-16-goal-bubble-rendering/progress.md`
### 阶段 3增加 /goal 用户气泡发送与持久化契约
- **Status:** complete
- **Started:** 2026-08-16
- Actions taken:
- 新增前端 `isGoalSetCommandText()`,仅为设置型 `/goal` 发送 `clientMessageId`
- 新增服务端 display-only Goal 展示消息持久化与稳定 ID 去重 helper。
- 通过 `session_message` 推送目标正文,避免复用普通 `handleMessage()` 运行时链路。
- Files created/modified:
- `public/app.js`
- `server.js`
### 阶段 4将 Goal 同步和成功反馈改为短暂精简提示
- **Status:** complete
- Actions taken:
- 同步、设置、暂停、恢复、清除反馈改为 transient 系统提示。
- 设置/暂停/恢复成功反馈只显示状态和 token 统计,不再回显完整目标正文。
- RPC 启动后失败保留已提交气泡,不恢复草稿;前置校验仍保留恢复语义。
- Files created/modified:
- `server.js`
### 阶段 5补充 Goal 气泡及消息协议回归测试
- **Status:** complete
- Actions taken:
- 增加前端设置型 Goal 识别与 payload 契约断言。
- 增加 session_message、display-only 元数据、成功文案、短暂属性和命令 ID 去重断言。
- 更新旧的“完全不持久化 /goal 用户消息”断言为新的展示消息契约。
- Files created/modified:
- `scripts/regression.js`
### 阶段 6运行语法、专项和全量回归
- **Status:** complete
- Actions taken:
- 已通过 `node --check public/app.js``node --check server.js``node --check scripts/regression.js`
- 已通过 `timeout 60s npm run regression`,输出 `Regression checks passed.`
- Files created/modified:
-
### 阶段 7执行真实浏览器桌面与窄屏验收
- **Status:** blocked by environment (not a code blocker)
- Actions taken:
- 确认 PM2 `ccweb` 服务在线并监听 `8002`
- 确认运行服务返回新前端脚本,普通用户气泡 CSS 仍保留右对齐布局。
- 按仓库规则检查运行会话,发现另一个 `/home/cc-web` 会话正在运行,因此未执行重启。
- 检查本机浏览器工具,未找到 Playwright、Puppeteer 或 Chromium 可执行文件。
- Files created/modified:
-
- Limitation:
- 未能完成真实浏览器桌面/窄屏截图与像素验收;功能与隔离回归已完成,后端新逻辑需在允许重启且有浏览器的环境做最终视觉确认。
- Concurrent work:
- 另一个运行会话同时修改了 `public/app.js``scripts/regression.js` 的侧栏折叠逻辑;未回滚,已通过当前工作树下的回归。
## Test Results
| Test | Input | Expected | Actual | Status |
|------|-------|----------|--------|--------|
| JavaScript 语法 | `node --check` 三个目标文件 | 无语法错误 | 全部退出 0 | passed |
| 全量隔离回归 | `timeout 60s npm run regression` | 回归通过 | `Regression checks passed.` | passed |
## Error Log
| Timestamp | Error | Attempt | Resolution |
|-----------|-------|---------|------------|
| 2026-08-16 | 仓库内 `todo-list-csv` 技能短路径不存在 | 1 | 使用技能清单中的实际安装路径 |
## 5-Question Reboot Check
| Question | Answer |
|----------|--------|
| Where am I? | 阶段 3增加 /goal 用户气泡发送与持久化契约 |
| Where am I going? | 计划审查、实现、回归、浏览器验收与差异清理 |
| What's the goal? | 把设置型 `/goal` 改为持久用户气泡,并收敛系统反馈 |
| What have I learned? | 见 `findings.md` |
| What have I done? | 已完成原因定位与任务规划 |

View File

@@ -0,0 +1,97 @@
# Task Plan: Goal 气泡显示修复
## Goal
`/goal <目标>` 在会话中显示并持久化为正常用户气泡,同时将同步与成功反馈收敛为短暂、简洁的系统提示,避免长目标正文渲染成居中的大面板。
## Current Phase
阶段 7执行真实浏览器桌面与窄屏验收
## Phases
### 阶段 1建立现状基线并固化 Goal 交互契约
- [x] 核对工作树、索引和现有 Goal 消息链路
- [x] 固化用户气泡、同步提示、成功提示及刷新恢复的验收语义
- **Status:** complete
### 阶段 2审查实施计划并修正关键缺口
- [x] 由独立计划审查员核对完整性、范围与可实施性
- [x] 修正任何阻断实施的计划缺口
- **Status:** complete
### 阶段 3增加 /goal 用户气泡发送与持久化契约
- [x] 新增 Goal 展示消息持久化 helper写入带稳定消息 ID、`ccwebDisplayOnly` 与 Goal 专用元数据的 `role: user` 消息
- [x] 通过 `session_message` 推送已持久化消息,使设置型 `/goal` 的目标正文生成普通用户气泡
- [x] Goal 展示消息只进入本地会话历史,禁止复用 `handleMessage()`,禁止触发 `handleCodexAppMessage`、普通 `turn/start``turn/steer`
- [x] 使用 `clientMessageId/requestId` 作为去重边界;同一命令 ID 只持久化一次且只调用一次 Goal RPC
- [x] 刷新只从 `session.messages` 恢复展示气泡,不把历史 Goal 展示消息重新解释为命令
- [x] 保持 `/goal` 查看、暂停、恢复、清除等控制命令语义不变
- **Status:** complete
### 阶段 4将 Goal 同步和成功反馈改为短暂精简提示
- [x] 将同步提示设为短暂提示
- [x] 成功提示不再回显完整目标正文
- [x] 明确失败顺序:参数/会话校验失败发生在持久化前并恢复草稿RPC 启动后的失败保留已提交气泡、不恢复草稿,避免重试产生重复气泡
- **Status:** complete
### 阶段 5补充 Goal 气泡及消息协议回归测试
- [x] 覆盖用户气泡呈现与持久化
- [x] 覆盖系统提示类型、短暂属性和精简文案
- [x] 增加负向断言Goal 展示消息带 display-only/Goal 元数据,不进入普通模型消息链路,不额外触发 turn/start/steer
- [x] 覆盖同一命令 ID 去重、刷新历史恢复且不重放 Goal RPC、RPC 失败后不重复恢复草稿
- [x] 更新被新交互契约替代的旧断言
- **Status:** complete
### 阶段 6运行语法、专项和全量回归
- [x] 执行 JavaScript 语法检查
- [x] 执行 Goal/前端专项回归
- [x] 执行相关全量回归并检查差异格式
- **Status:** complete
### 阶段 7执行真实浏览器桌面与窄屏验收
- [ ] 在桌面视口验证长 Goal 为用户气泡
- [ ] 在窄屏验证换行、溢出和系统提示尺寸
- [ ] 确认暗金荒野主题未再生成大块 Goal 系统面板
- **Status:** in_progress
### 阶段 8审查差异并清理临时任务记录
- [ ] 审查目标文件差异且不混入其他任务改动
- [ ] 完成计划记录并删除本任务 TODO CSV
- **Status:** pending
## Key Questions
1. 设置型 `/goal` 气泡如何持久化而不进入普通模型对话链路?
2. 如何只改变 Goal 命令,不改变其他 Slash 命令的既有行为?
3. 长 Goal 在桌面与窄屏下是否仍保持普通用户气泡布局?
## Decisions Made
| Decision | Rationale |
|----------|-----------|
| 只修改 Goal 消息语义,不重做通用气泡或主题 | 控制范围,避免影响其他系统提示和主题 |
| 同步提示与成功提示采用短暂、精简反馈 | Goal 原文已在用户气泡中,不应重复铺满消息区 |
| 计划文件放在独立 `.planning` 目录 | 根目录已有其他任务的规划文件,必须避免覆盖 |
| Goal 气泡使用独立展示消息路径 | 写入 `session.messages` 并发出 `session_message`,但不调用普通消息运行时,兼顾刷新恢复与防止重复模型执行 |
| `clientMessageId/requestId` 是命令与消息去重键 | 传输重放时可识别同一次设置,避免重复气泡与重复 Goal RPC |
| 校验前失败恢复草稿RPC 已启动后失败保留气泡且不恢复草稿 | 保持即时提交记录,同时避免用户重试产生两条相同气泡 |
## Errors Encountered
| Error | Attempt | Resolution |
|-------|---------|------------|
| 仓库内 `todo-list-csv` 技能短路径不存在 | 1 | 改用技能清单给出的 `/home/hdzx/.codex/skills/todo-list-csv/` |
## Notes
- 任务开始时已有 `public/task-board.css``public/task-board.js``scripts/task-board-frontend-unit.js` 未提交改动,本任务不触碰这些文件。
- 根目录已有其他任务的 TODO CSV本任务只维护 `Goal 气泡显示 TO DO list.csv`

View File

@@ -0,0 +1,25 @@
# 调查记录
- 用户截图视口约为 1997×1247左侧栏约 443px侧栏处于完整展开状态。
- 截图中项目节点自己的展开箭头可见;缺失的是控制整个左侧栏收起的入口。
- 任务开始时工作树已有 `public/task-board.css``public/task-board.js``scripts/task-board-frontend-unit.js` 改动及另一任务的计划文件,均不属于本任务。
- 修复应只覆盖侧栏控件,不扩展到主题整体视觉。
- 独立计划审查已通过;审查器补充确认代码中已有 `#menu-btn``sidebar-collapse` 回归目标,应优先排查现有入口的 DOM、状态和最终 CSS。
- `codebase-memory-mcp` 项目 `home-cc-web` 索引状态为 ready6226 节点、14256 边),无需重建索引。
- 仓库存在 `.trellis/workflow.md` 和前端规范;未发现 `.agents/skills``.codex/agents` 目录。
- Trellis 工作流要求:文件改动任务应建立独立 task/PRD/context实施与检查由独立代理完成当前前端规范索引仍是占位型说明后续需读取具体质量文件。
- 本环境未暴露 `trellis-brainstorm``trellis-implement``trellis-check` 技能或专用 agent 类型,将在不改写并行会话状态的前提下用 Trellis 脚本和通用 worker/explorer 代理降级执行。
- Trellis 开发者身份为 `shiyue`;当前全局 task 指向 `.trellis/tasks/08-11-task-board`,与已存在的 task-board 脏改动一致。
- 为避免打断并行任务,本任务只创建独立 Trellis task不执行 `task.py start`,也不改写 `.trellis/.current-task`;所有代理改用显式任务路径加载上下文。
- 现有 DOM、JS 和专项回归均保留 `#menu-btn`;用户截图来自带 Home Indicator 的横屏触控设备,最可能的根因是宽度大于 768px 但无 hover/精细指针时同时错过 drawer 与 desktop-collapse 两种媒体条件。
- 修复方向应把“宽屏固定折叠”与“鼠标 hover 临时预览”拆开:前者按宽度可用,后者仍按设备能力渐进增强。
- 本地源码已确认根因:`#menu-btn` 基础样式为 `display: none`,仅在 `max-width: 768px``(width > 768px) and (hover: hover) and (pointer: fine)` 中显示JS 的桌面点击分支也只接受后一个条件。
- 因而宽触控横屏设备确实同时错过两个条件,截图中的按钮消失与点击空档可由现有代码直接解释。
- 现有专项回归已经集中在 `assertFrontendSidebarCollapseContract()`,适合先扩展媒体条件断言,再改 `app.js` / `style.css`
- `package.json` 仅提供 `npm run regression`;侧栏专项目标可直接用 `node scripts/regression.js --target sidebar-collapse` 执行,无独立前端构建步骤。
- 实施 diff 只在侧栏相关区块新增宽屏媒体条件拆分、hover 预览监听和专项断言;同文件另有并行会话加入的 `/goal` 变更,必须保留并在最终审查中区分。
- 当前 cc-web PM2 服务监听 `8002`,可直接返回本地 `index.html``style.css``app.js`;资源内容已包含本轮宽屏媒体条件拆分,无需重启服务即可确认静态文件生效。
- `3000` 端口是另一套 PinchChat nginx 页面,不能用于本项目视觉验收;已停止使用该端口。
- 当前环境没有 Playwright npm 模块,也没有 `chromium`/`google-chrome` 可执行文件,因此无法执行真实浏览器截图、触控点击和 computed style 验收;不能把静态资源检查当成视觉通过。
- 全量 `npm run regression` 也通过(`Regression checks passed.`);宽触控专项与现有其它前端契约未出现冲突。
- 8002 服务的入口、cache-busted CSS 和 JS 请求均返回 HTTP 200服务无需重启即可提供修改后的静态内容。

View File

@@ -0,0 +1,21 @@
# 进度日志
## 2026-08-16
- 已读取适用技能、主题架构和视觉回归经验。
- 已查看用户截图并记录缺失入口的层级。
- 已执行工作树基线检查,确认需避让任务看板相关脏文件。
- 独立计划审查通过;第 1 阶段完成,开始定位现有折叠链路。
- 已确认 codebase-memory 索引可用,并完成 Trellis 文件入口扫描。
- 已读取 Trellis 工作流、workspace 入口和前端规范索引,准备确认开发者身份与当前 task避免覆盖其他会话。
- 已运行 Trellis 会话上下文检查;确认当前 task 属于并行任务看板工作,本任务将使用独立但不激活的 task。
- 已创建 `.trellis/tasks/08-16-sidebar-collapse-button`,补充 PRD 与根因研究记录。
- 已完成 Trellis implement/check context 配置;一次 `search_graph` 传输错误已记录,改用备用检索路径。
- MCP 备用搜索再次传输关闭,已切换到本地源码检索并保留失败记录。
- 本地 `rg` 已确认 `#menu-btn` 的显示规则与 JS 媒体条件存在宽触控空档,根因假设成立;进入回归断言设计。
- 第 2 阶段完成,进入专项回归断言阶段。
- 已确认专项回归命令与 npm 脚本入口,实施代理已开始修改目标链路。
- 实施代理已完成 2.1;目标侧栏 diff 已审阅,确认未触碰 task-board 文件,但 `app.js` / `regression.js` 同时存在并行 `/goal` 改动。
- 已通过 `node --check`、侧栏专项回归和 `git diff --check`8002 服务返回的 HTML/CSS/JS 已包含最新侧栏改动。
- 进入真实浏览器验收,但环境缺少 Playwright/Chromium记录为明确的验证缺口。
- 全量回归通过;代码层与静态资源层验证完成,视觉层仍受浏览器运行时缺失限制。
- 按主题验收清单补做 8002 入口/CSS/JS HTTP 200 检查;真实浏览器截图与多视口 computed style 仍未完成。

View File

@@ -0,0 +1,30 @@
# 左侧树折叠按钮修复计划
## 目标
恢复左侧会话/项目树的整栏折叠入口,确保当前主题和响应式视口下可见、可操作,并保持现有项目节点展开逻辑不变。
## 范围
- 只处理整个左侧栏的折叠/展开控件、状态和必要样式。
- 不改项目节点自身的展开箭头,不重做主题,不触碰任务看板改动。
## 阶段
1. [DONE] 记录现状并复现左侧栏折叠入口缺失
2. [DONE] 定位侧栏折叠状态、控件与主题样式链路
3. [DONE] 补充折叠入口可见性与交互回归断言
4. [DONE] 恢复折叠按钮并限定响应式与主题样式
5. [DONE] 运行语法检查与相关自动化回归
6. [IN_PROGRESS] 在真实浏览器验证展开折叠及多视口表现
7. [TODO] 审查最终差异并清理临时跟踪文件
## 完成标准
- 展开态存在清晰可点击的收起按钮,折叠态存在恢复按钮。
- 鼠标、触控与键盘均可操作,具备正确无障碍名称和状态。
- 目标截图视口、常规桌面和窄屏不遮挡关键内容。
- 自动化回归、语法检查、差异检查通过。
## 错误记录
- `rg --files .trellis .agents/skills .codex/agents` 因后两个目录不存在返回状态 2但成功列出 `.trellis`;后续仅查询实际存在路径。
- `codebase-memory-mcp/search_graph` 首次调用传输关闭;已记录,后续改用已成功的 `search_code` 与本地 `rg` 交叉校验,不重复同一失败调用。
- 随后的 `codebase-memory-mcp/search_code` 也因传输关闭失败;本阶段降级为本地 `rg`/`sed`,不再重试已关闭的 MCP 通道。
- 最初访问 `127.0.0.1:3000` 命中另一套 PinchChat nginx 页面;已定位 cc-web 实际端口为 `8002`,后续资源检查改用该端口。
- 计划状态更新补丁曾因 hunk 格式错误失败;未修改业务文件,随后基于文件尾部重新提交。