docs: add 2026-06-02 功能线总问题台账(逐跳对账)
按 F1-F9 主要功能线端到端逐跳对账:登录/Sub/蜂群/凭证/产物/计费/客户端/鲁棒性/驾驶舱, 每条标注严重度+文件:行+置信度(含需实跑确认的 caveat),附上线最关键 5 条。
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# Heicode 功能线总问题台账(逐跳对账)
|
||||
|
||||
> 日期:2026-06-02
|
||||
> 方法:按主要功能线做端到端「逐跳对账」——每跳核对生产者写了什么、消费者是否真消费、是否落地/占位/路由不一致。
|
||||
> 范围:`HeiCode-Swarm`、`heicode-mananger`、`heicode-macos-release`、`heicode-winos-release`
|
||||
> 关联:`chek/2026-06-01_*`(P1–P7、标准清单)、`chek/2026-06-02_产品维度复审-能力覆盖度.md`
|
||||
> 性质:只读代码核查 + 部分子代理追踪;标注置信度;**未实跑**的结论已注明需运行时确认。
|
||||
|
||||
---
|
||||
|
||||
## 0. 一句话总览
|
||||
|
||||
后端控制面/契约成熟,但**客户端没接新统一 API、关键链路在生产默认配置下退化、回调与路由多处不一致**。最致命的是:**P1“假完成”修复未到达客户端**、**macOS 首聊大概率失败**、**客户端仍打已废弃的 `/api/agnet/*`**。
|
||||
|
||||
> ⚠️ 重要 caveat:多处“Swarm 路由不存在/不匹配”是对 `HeiCode-Swarm` 仓库默认配置核的;对接文档记录生产烟测可通,**生产很可能跑另一套 Runtime(agent_management) 或 env 改了路径**。这类项必须**实跑确认**,不能只凭读码定论。
|
||||
|
||||
---
|
||||
|
||||
## 1. 功能线 × 严重度总表
|
||||
|
||||
| 功能线 | P0(阻断) | P1(假成功/数据错) | P2(契约漂移) | 总体 |
|
||||
|---|---|---|---|---|
|
||||
| F1 登录/配对/模型/对话 | mac 首聊失败;win 配对竞态 | 登录 typo;模型刷新依赖配对 | 错误文案泛化 | 🔴 win 勉强/mac 高危 |
|
||||
| F2 Sub 敏捷全链路 | 客户端走 `/api/agnet/*`;status/content 路由缺 | 客户端不读 display_status(假完成仍现) | 多数 plan 字段没人读 | 🔴 |
|
||||
| F3 蜂群(Swarm) | 客户端无蜂群入口;生产默认 `SWARM_RUNTIME_ENABLED=false` | DAG 默认关;handoff.completed schema 不符 | UI 文案全 Sub Agile 化 | 🔴 |
|
||||
| F4 凭证/审批/资源注入 | — | 高危 Manager 不阻断;lease 占位 | grant 写了没人读 | 🟠 |
|
||||
| F5 产物生命周期 | 真实文件 vs markdown 解析错位;content 路由缺;客户端未接 | files_modified 未聚合→判 document | revision 不回 Runtime | 🔴 |
|
||||
| F6 计费/用量 | — | 蜂群直连漏收;信任旁路可透支 | billing_context 不参与扣费主体 | 🟠 |
|
||||
| F7 客户端 vs Claude Code | — | 全 GPT、关 thinking/搜索/缓存 | 高级压缩 stub | 🟠 |
|
||||
| F8 Swarm 鲁棒性 | — | 无原子领取;重启可双跑 | checkpoint 未接线 | 🟠 |
|
||||
| F9 企业驾驶舱 | — | 指标几乎空(硬编码 0/dead code) | — | 🔴 覆盖 ~15% |
|
||||
|
||||
---
|
||||
|
||||
## 2. F1 登录 / 配对 / 模型 / 对话
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 1.1 | 🔴 P0(mac) | macOS anthropic preset 不走 V2 proxy(直连 + sentinel key),OAuth 下配对用空 JWT → **登录成功但发不出对话** | `heicode-macos-release/.../providerService.ts:385-394`、`heicode-auth.ts:964-967,981` |
|
||||
| 1.2 | 🟠 P1(win) | 配对异步,登录后立即开聊 → `not_paired` 401(竞态) | `heicode-winos-release/.../heicode-auth.ts:993-999`、`handler.ts:534-538` |
|
||||
| 1.3 | 🟠 P1 | 邮箱密码登录 Step2 URL typo:客户端 `from-agnet` vs Manager `from-agent`→404(UI 已隐藏,影响低) | `heicode-auth.ts:546` vs `api-router.go:88` |
|
||||
| 1.4 | 🟡 | 登录后刷新模型依赖 V2 配对,legacy sk 已清→可能 401 | `providerService.ts:577-579` |
|
||||
| 1.5 | 🟡 | 默认 `gpt-5.4` 是否在用户 group/channel 决定首聊成败;错误被泛化文案掩盖 | `providerPresets.json:22-26` |
|
||||
| 1.6 | 🟡 | 时钟漂移>2min / nonce 多实例无 Redis → V2 401,UI 未专门翻译 | `device_signature.go:204`、`nonce_store.go:15` |
|
||||
|
||||
Manager 侧 V2(pubkey/pair/TokenAuth/relay/诊断头)整体**真落地**;问题集中在**客户端,且 mac/win 实现分叉**。
|
||||
|
||||
---
|
||||
|
||||
## 3. F2 Sub 敏捷全链路
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 2.1 | 🔴 P0 | **客户端不消费 `display_status`**,自算 `deployment.status` → P1“假完成”修复对用户**无效**,仍显示已完成 | 客户端全仓零引用 display_status;`heicodeTaskStore.ts:1226-1234` vs Manager `agent_runtime_client.go:788-808` |
|
||||
| 2.2 | 🔴 P0 | 客户端代理仍打 `/api/agnet/user/*`,Manager 已改名 `/api/agent/*`(文档称 agnet 已 404) | `heicode-tasks.ts:231-305` vs `api-router.go:510-523` |
|
||||
| 2.3 | 🔴 P0(待实跑) | Manager 默认 sub create 路径 / `/api/swarms/{id}/status` / artifact content 在 Swarm 仓库不存在→reconcile/下载失败(生产可能用别的 Runtime) | `agent_runtime_client.go:100,126` vs `main.py:1159-1161` |
|
||||
| 2.4 | 🟠 P1 | Runtime 默认单 `general` 任务,忽略用户选的 backend/多 role | `swarm_runtime.py:586-600` |
|
||||
| 2.5 | 🟠 P1 | 模型/billing 不受 plan 约束,Agent 用容器 env(`ANTHROPIC_API_KEY`+env model) | `task_executor.py:31-39` |
|
||||
| 2.6 | 🟠 P1 | usage 回调复用 `budget.alert`,与 Manager schema(`threshold_pct`) 不符→可能被拒 | `main.py:941` vs `agent_callback.go:486` |
|
||||
| 2.7 | 🟡 P2 | `agile_context(stage/checkpoint/acceptance)`、`resource_grants`、`allowed_model_ids`、`deliverable` 多为“写了没人读” | 见逐跳台账 |
|
||||
|
||||
---
|
||||
|
||||
## 4. F3 蜂群(Swarm)
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 3.1 | 🔴 P0 | 桌面**无蜂群产品入口**,从不调用 `/api/heicode/swarm/tasks` 或 `/api/swarms`;建任务写死 `sub_agile` | `heicodeTaskStore.ts:1502-1506,1690` |
|
||||
| 3.2 | 🔴 P0 | 生产默认 `SWARM_RUNTIME_ENABLED=false`→只落库不 dispatch | `agent_control_plane.go:1267-1268` |
|
||||
| 3.3 | 🟠 P1 | DAG 默认关(`ENABLE_SUBTASK_HANDOFF=false`),蜂群退化为单 Agent 单任务 | `swarm_runtime.py:77-83`、`k8s/agent-deployment-full.yaml:12` |
|
||||
| 3.4 | 🟠 P1 | `handoff.completed` 缺 `from_role/to_role`,Manager schema 必填→可能被拒/不落库 | `main.py:779-786` vs `agent_callback.go:478-479` |
|
||||
| 3.5 | 🟠 P1 | capability 用 role 名、Agent 注册 `general` → 任务永久 pending 假死 | `task_queue.py:151-156`、`agent/main.py` 默认 capabilities |
|
||||
| 3.6 | 🟡 P2 | task.*/handoff.* 不驱动 deployment 状态;无任务图结构化展示;UI 把 swarm 文案替换成 Sub Agile | `applyAgentCallbackDeploymentState`、`heicodeTaskStore.ts:666` |
|
||||
|
||||
---
|
||||
|
||||
## 5. F4 凭证 / 审批 / 资源注入(安全)
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 4.1 | 🟠 P1 | 高危操作 Manager **不阻断**部署,立即 accepted+dispatch | `agent_control_plane.go:1067-1122`;`RequiresUserApproval` 仅 struct |
|
||||
| 4.2 | 🟠 P1 | lease 是 `lease://` 占位,不 mint 真凭证、不读 KV | `agent_approval.go:213-228` |
|
||||
| 4.3 | 🟠 P1 | Agent 用全局 `GIT_USERNAME/GIT_TOKEN` 环境变量,不读 grant/lease/secret_ref → 串仓/越权 | `git_operations.py:32-33`;agent 无 grant 读取 |
|
||||
| 4.4 | 🟡 P2 | revoke lease/grant 不同步 Runtime(approve 有 sync、revoke 无)→撤销滞后 | `agent_approval.go:339-349` |
|
||||
| 4.5 | 🟡 P2 | Runtime payload 不按 status 过滤 grant;manifest 过滤 active(不一致) | `agent_runtime_client.go:302` vs `agent_control_plane.go:880` |
|
||||
| 4.6 | 🟡 | 用户可自填 `azkv://` 引用,仅验前缀不验 vault 归属 | `resource.go:170-171` |
|
||||
|
||||
---
|
||||
|
||||
## 6. F5 产物生命周期
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 5.1 | 🔴 P0 | **双模型错位**:Runtime 写真实文件 + 元数据,Manager 却按“单 markdown”parse → `project_folder` 常空/假 | `task_executor.py:529-564` vs `heicode_project_artifacts.go:92-95,176-238` |
|
||||
| 5.2 | 🔴 P0 | `files_modified` 只在 subtask 级、未聚合到顶层 → 常判 `document`/summary-only → `is_project:false` | `main.py:683-685` |
|
||||
| 5.3 | 🔴 P0(待实跑) | Swarm 无 `/artifacts/{id}/content` 路由,Manager 代理目标不存在 → 下载不通 | `agent_runtime_client.go:549-631` vs `main.py` 无 content 路由 |
|
||||
| 5.4 | 🔴 P0 | 客户端未接 unified 产物 API(manifest/files/archive/local-edits),只用 legacy 单 blob | `heicode-tasks.ts:251-259`、客户端零引用 `is_project/project_folder` |
|
||||
| 5.5 | 🟠 P1 | revision consume 只改 DB 状态,不推 Runtime、不合并 manifest(revision 恒=1),续跑不生效 | `heicode_task_create.go:193-218`、`heicode_artifact_edits.go:169-181` |
|
||||
| 5.6 | 🟡 P2 | `parseMarkdownProject` 无 `..` 净化(潜在 zip-slip);冲突检测 `BaseRevision=0` 可绕过 | `heicode_project_artifacts.go:216-220,367` |
|
||||
| 5.7 | 🔴 | 云部署 `pending_worker` 后无 Worker 消费 → 产物→上线闭环为 0 | `heicode_cloud_deploy.go:14-17,123` |
|
||||
|
||||
---
|
||||
|
||||
## 7. F6 计费 / 用量 / 额度
|
||||
|
||||
> 扣费在 **Manager relay** 真落地(PreConsume gate → 上游 usage → SettleBilling delta),按 **Token 所属 user.id** 扣。以下是风险点:
|
||||
|
||||
| # | 严重度 | 问题(多付/漏收/扣错) | 证据 |
|
||||
|---|---|---|---|
|
||||
| 6.1 | 🟠 P1(漏收) | 蜂群/Runtime 若用独立 API key 直连厂商、不经 relay → **不扣用户 quota** | `task_executor.py:31-53`;callback 无 DecreaseUserQuota |
|
||||
| 6.2 | 🟠 P1(漏收) | Runtime 回传 `tokens_used` 只入库/告警,**不触发扣费** | `agent_callback.go:648-746` |
|
||||
| 6.3 | 🟠 P1(多付) | 信任旁路预扣=0 但结算仍扣,`quota` 无下限→可透支/负数 | `billing_session.go:281-314`、`user.go:927` |
|
||||
| 6.4 | 🟡 P1(多付) | Realtime 入口预扣 + 流式 `PostWssConsumeQuota` + 最终 Settle → 叠加扣费空间(需日志核) | `relay-openai.go:452-556`、`websocket.go:44` |
|
||||
| 6.5 | 🟡 P2(扣错人) | `billing_context.newapi_user_ref/correlation` 不参与扣费主体映射;Runtime 服务 token 调网关会扣服务账号 | `agent_runtime_client.go:397`;relay 用 `token.UserId` |
|
||||
| 6.6 | 🟡 | Agnet 资源费(EU/X/5·8 上限)未实现;budget 仅创建时校验、执行中只按时长告警 | `agent_control_plane.go:697-698`、`main.py:882-904` |
|
||||
|
||||
---
|
||||
|
||||
## 8. F7 客户端 vs Claude Code(体验)
|
||||
|
||||
| # | 严重度 | 问题 | 证据 |
|
||||
|---|---|---|---|
|
||||
| 7.1 | 🟠 | 四档模型全映射 `gpt-5.4`,非真 Sonnet/Opus/Haiku | `providerPresets.json:22-26` |
|
||||
| 7.2 | 🟠 | 非 1P URL + proxy 路径关闭 thinking / WebSearch / tool search / 高级 prompt caching | `thinking.ts:104-127`、`WebSearchTool.ts:172-192`、`toolSearch.ts:299-310` |
|
||||
| 7.3 | 🟡 | reactive/cached compact、history snip、context collapse 等高级压缩是 ant-only stub | `reactiveCompact.ts`、`cachedMicrocompact.ts`(__stubMissing) |
|
||||
| 7.4 | 🟡 | AGENTS.md 未纳入 CLAUDE.md 发现链 | `claudemd.ts` |
|
||||
| 7.5 | 🟡 | 桌面四跳延迟 + 空闲停子进程冷启动 | `ws/handler.ts:736-748` |
|
||||
|
||||
---
|
||||
|
||||
## 9. F8 Swarm 鲁棒性 / F9 企业能力
|
||||
|
||||
- **F8**:无 Redis 原子领取/租约;Orchestrator 启动无 reconcile,重启 30s 后可能把在跑任务重新入队→双跑;checkpoint 模块写了未接线;失败重试无退避。证据:`task_queue.py:114,158,372`、`main.py:244`、`checkpoint_manager.py`。
|
||||
- **F9**:项目进度/里程碑/Bug/ETA/风险/质量趋势后端聚合与前端页面**基本缺失**;进度 snapshot `failure_rate/avg_duration` 硬编码 0;`CockpitView` dead code。证据:`agent_control_plane.go:1832-1860`。审计链路**已实现**。
|
||||
|
||||
---
|
||||
|
||||
## 10. 上线最关键 5 条(按“明天会不会翻车”排序)
|
||||
|
||||
1. **mac 首聊失败(F1.1)** → 建议明天只放 Windows。
|
||||
2. **客户端不读 display_status(F2.1)** → “假完成”照旧;小改、应抢修。
|
||||
3. **客户端打 `/api/agnet/*`(F2.2/F3.1)** → Sub/蜂群任务从客户端可能 404;需确认 Manager 是否留别名。
|
||||
4. **产物链路双模型错位 + content 不通(F5.1/5.3/5.4)** → “拿代码/下载工程包”这条 demo 路径可能空。
|
||||
5. **win 配对竞态(F1.2)** → 登录后稍等再开聊,或改成 await。
|
||||
|
||||
> 这 5 条里 1/2/5 是纯客户端↔Manager、可本地冒烟确认;3/4 含“生产可能用别的 Runtime”的 caveat,**必须实跑**。
|
||||
|
||||
---
|
||||
|
||||
## 11. 方法论说明(为什么这次更全)
|
||||
|
||||
- 抽样审计(顺问题翻)只看到“Manager 修了 P1”;**逐跳对账(生产者↔消费者)才发现“客户端没接 = 没修”**。
|
||||
- 凡“写了没人读 / 校验了不使用 / 路由不一致 / 硬编码占位”均单列。
|
||||
- 代码审计天花板:跨服务路由/运行时镜像差异**必须实跑**确认(本台账已标注 caveat 项)。
|
||||
|
||||
---
|
||||
|
||||
*只读核查结论,证据可于对应仓库 `文件:行` 复核;标注“待实跑”的项需运行时验证。*
|
||||
Reference in New Issue
Block a user