Skip to content

Private web UI#148

Merged
kill136 merged 55 commits into
mainfrom
private_web_ui
Jun 5, 2026
Merged

Private web UI#148
kill136 merged 55 commits into
mainfrom
private_web_ui

Conversation

@kill136

@kill136 kill136 commented Jun 5, 2026

Copy link
Copy Markdown
Owner

Summary

Changes

Related Issue

Testing

  • npx tsc --noEmit passes
  • npm test -- --run passes
  • Manually tested in CLI mode
  • Manually tested in Web UI mode

Screenshots

kill136 and others added 30 commits June 1, 2026 06:22
…n 交付缺口修复

两批验证通过的护城河收尾,执行 2026-05-27 早拍「发布即公开」决策:

1) makePublic(真人交付最后一公里,从 super-agent vercel-client.ts 移植)
   - VercelDeployAdapter.makePublic(idOrName): PATCH /v9/projects/{id}
     置 ssoProtection+passwordProtection=null → 生产 URL 公开可分享(不再 401 需登录)
   - DeployAdapter 接口加 optional makePublic?(Railway 源码部署默认公开,不实现)
   - 接入 handlePublishToAxonApp Vercel 分支:deploy+waitUntilReady 后自动 makePublic,
     失败降级不 brick(app 已部署 URL 已在,铁律6 不掩盖),成功消息「可直接发给任何人」
   - publish.json 记 public:madePublic;2 单测(PATCH body 双 null + HTTP 错误透出),deploy 9/9 绿

2) chrome-extension 交付缺口修复(E 类护城河必赢场景全通)
   - detectChromeExtension(cwd): 找 manifest.json(优先 dist/ 编译产物)+校验 manifest_version
     +扩展入口字段,区别于普通 web manifest
   - deliver_app no-devScript 分支:识别扩展 → 给 /api/files/export-zip 下载 + chrome://extensions
     加载已解压指引,替代原泛泛「无 dev server」死胡同
   - e2e-full-flow 加 chrome-extension case;coverage 文档对账标 E 类 5 场景全接通

typecheck 干净 + deploy 单测 9/9 绿。仅动 conversation.ts(避开 shared/types.ts trust overlay 污染)。
遗留:真 publish e2e 需 cloud edition+VERCEL_TOKEN,运行时关 protection 可能被 classifier 单次拦。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
真 e2e 暴露的健壮性缺口治本 + 双路径真发布实证留档:

1) RailwayDeployAdapter.resolveWorkspaceId 自适应 workspace token
   - 真坑:.env 的 RAILWAY_API_TOKEN 是 workspace token,me{} 查询 Not Authorized
     → 全栈 publish 生产路径直接撞墙(adapter 原只会报错让用户手配 RAILWAY_WORKSPACE_ID)
   - 治本(铁律3 不靠手配):me 无权时自动 fallback 用顶层 projects 查询反查 workspaceId
     (workspace token 实测可查 projects 但不可查 me)。两类 token 零配置自适应;
     仅「无权+零现有项目」窄场景才需手配。+2 单测(反查成功 / 零项目才报错),15/15 绿

2) 真 publish e2e 验证脚本(破「真人交付=0」技术能力双路径实证,仿 m15-vercel-poc.ts)
   - scripts/m15-real-publish-verify.ts:静态→Vercel,前后对比铁证 makePublic
     (before 401 authWall → after 200 公开命中 marker)
   - scripts/m15-railway-fullstack-verify.ts:全栈→Railway+Neon,Express+Postgres 真读写
     +公网域名 200,try/finally 用完即删(projectDelete+Neon deleteProject+temp),零计费残留
   - 两脚本均实跑 PASS(Vercel 6.4s / Railway 209s)

typecheck 干净。仅动 deploy 层,无 trust-overlay 污染。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 删死命令 mirror:upload:cos(引用文件 scripts/upload-tencent-cos-installer.cjs 不存在)
- 删冗余别名 web/web:start/web:dev(== dev/start/≈dev:watch,web: 前缀是 terminal CLI 时代遗产)
- web:debug/web:evolve 改名归位 dev:debug/dev:evolve(统一 dev: 命名空间)
- 修 install:playwright:删废弃包 @playwright/cli,项目实际只用 playwright-core
- 修 eval/eval:smoke 默认模型 → gpt-5.5(原默认 sonnet,非项目可用 backend,跑不通)
- 补 eval:regression(CLAUDE.md 力推的回归门之前无脚本)+ typecheck
- 同步 bug_report.yml 的 npm run web → npm run dev
- 清 settings.local.json 指向已删 src/cli.ts 的死权限

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
依赖图扫描 928 源文件 → 34 候选孤儿 → 3 路 agent 逐个核实死活(查导出符号引用+registry 注册+动态 import)→ tsc 双绿(server+client)+grep 零残留+registry 单测兜底。

- 后端死模块 14:create-tool/create-agent(并入 create.ts)、knowledge-compile/ingest(并入 knowledge.ts)、notebook-write(并入 Write)、network-agent(注册表已 Removed)、structured-output、core/backgroundTasks(被 bash.ts 取代)、statusline、task-reviewer、browser-test-tools、blueprint-hooks、knowledge/curator
- 基础设施死模块 9:mcp/{auto-discovery,cancellation,notifications,roots}、debugger/dap-client、utils/{pr-status,terminal-setup,terminal-tab}(终端 CLI 已死)、wizard/onboarding
- 前端死组件+连带 CSS 16:ImagePreviewPanel(被 ImageCanvasPanel 取代)、SessionSidebar/SessionSearchModal(旧 IDE 布局)、CallGraphViz(Enhanced)、VirtualizedTreeView、MergeView、i18n/locales.ts(被 locales/{en,zh} 取代)
- 孤儿测试 4:随 backgroundTasks/bash-history/network-agent 死模块连带删

保留 tree-render.ts(一度列死但有真实测试覆盖=假阳性)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 删 deploy/epay 实验残骸(Dockerfile/railway.toml/start.sh + 4 个 logs)
- 删 docs/blog/swarm_mode 营销稿与配图(非产品代码)
- 删 axon-launch-deck-2026.pptx 与孤儿 .blueprint 缓存
- 删 8 个失效旧 UI/单测(已无对应源码),vitest.config 同步移除引用

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
架构转向(project_code_routing_removal_pivot):把 chip→mode→toolFilter 的
代码路由层迁成 agent 原生可组合 skill,输入自动组合 prompt+工具(对齐 Manus
chip=skill)。

- src/skills/builtin/* 11 个 SKILL.md(slides/website/design/video/audio/
  schedule/wide-research/visualization/spreadsheet/app/desktop-app)
- activate_skill 工具 + skill-composition:catalog 注入 + active 正文进 coding
- slides-guard:toolFilter 防逃逸 + 内容完整性门拦 Write 覆盖丢模板
- generate_slide_deck / report_progress 工具落地并注册
- conversation.ts 按 toolUse.name 拦截 skill/slides 门(marker 工具范式)
- manus-prompt/modeRegistry 接 skill 组合层;shared/types 补 ws 事件

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- route-map:把"诊断 agent 跑偏"编码成确定性分析器,symptom→suspect 定位
  (DeliveryFlow 决策关卡 + diagnoseRoute 只点 suspect,下游标 downstream)
- liveness-probe:静默挂起检测器(无终止信号到达的纯检测)+ /api/route-map
  /api/code-situation 路由接线
- M17-M20 overview spec:请求路由地图 / 前后端契约硬化 / 动态过程叙事 /
  应用骨架层(Settings/Personalization/Library/通知)
- spec README/decisions-pending/status 同步;.gitignore 排除 .milestone-verified.json

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- CommanderPanel + commanderLens/kingdomLens/pipelineTrust:老程序员"读不过来/
  看不到哪有 bug"痛点 → 全局地图,硬门证过 vs 模型嘴上说的(🟢只能 server 盖章)
- CodingPipelinePanel 接信任叠加层 + trust 测试
- SettingsModal / AvatarMenu / WorkbenchTopBar:应用骨架层(M20)UI
- FollowupSuggestions:M19.c follow-ups consumer(parseFollowups 接线)
- ChatPane/index/ManusWorkbench 接线上述面板

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- silent-hang:静默挂起活体 suite(喂精确签名验 liveness-probe 检测)
- real-ui-journey:像用户一样在真前端 :3456 走旅程(补 eval 不渲染真前端盲区)
- live-narrative:M19 动态过程叙事 suite
- regression 汇总接入新哨兵

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Manus 复刻北极星的调研证据:HAR/DOM 反推、12 mode 实拍、应用骨架层抓包、
高保真 mockup 与原型页。

注:含 4 个 .webm 实拍录屏(~72M),经确认入库以保留完整对标证据。
后续若仓库体积成本敏感,可迁 Git LFS 或外部存储。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- websocket:前端 payload 带 axon-profile-* → chatContext 透传 conversation.chat()
- manus-prompt 注入门测试:全局生效(含 coding)+ 不传不污染 + 顺序(用户约束更显著)
- 「LLM 真个性化响应」是活体效果待 gpt-5.5;此处钉死「注入成功」确定性半链路

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
对照 manus-parity 高保真截图对齐 Manus 应用骨架层,全部真前端 chromium 截图回验:

- M20.d UsagePane(对齐 33-set-usage):任务/网站/算力 tab + Free·升级 + ✦额度余额
  (读 NewAPI /quota,守红线不自建计费)+ 消耗明细/三维诚实占位(NewAPI 明细端点 +
  M13/M15 埋点未建)。
- M20.e LibraryView(对齐 46-nav-library,用户拍板「重做库为主区交付物视图」):
  把原左栏模板画廊改为主区交付物网格 —— 按日期分组 + 搜索 + 我的收藏(localStorage,
  避开 SessionMetadata favorite schema)。数据走 /api/artifacts;点卡片 selectSession +
  自动关库(index.tsx 监听 currentSessionId)。TaskListPane「库」nav 上抛 onOpenLibrary。
- M20.f AccountPane(对齐 44-account):读 /api/auth/oauth/status 显示头像/名/邮箱/
  账号类型/登录状态 + 退出登录。修截图揪出的 bug:已登录但无名/邮箱时回退「axon 用户」
  而非自相矛盾的「未登录」。
- M20.c 补口:webdev Blueprint 确认后首条 chat 也带 profile(对抗验证工作流发现)。

测试:LibraryView 8 + SettingsModal 15(含 Usage/Account)组件测试全绿,tsc 0。
排除自动生成的 code-situation.json。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人纪律落地(/goal 全部对齐):把「视觉像但功能缺」的 Settings 占位壳砍成真功能,
全部真前端 chromium 截图验证 + 不造假壳:

- 集成 IntegrationsPane → GET /api/connectors(10 真 provider:GitHub/Gmail/Notion/Slack/
  Feishu/DingTalk/Linear/Jira…),connect 走真 OAuth 弹窗 / mcp-oauth-connect,disconnect 真动作。
  复用 ConnectorsPanel 的 getConnectorIcon 品牌 SVG(命名导出,不重造)。
- 我的插件 MyPluginsPane → 同 connectors 的 MCP 能力视图(已连接显工具数徽标);
  ★无连接时诚实空态,不画假数据★。
- 数据控制 DataControlsPane → GET /api/sessions 真会话总数 + 留存说明 + 删除全部(二次确认真 DELETE)。
- 我的电脑 MyComputerPane → /api/auth/oauth/status 真 runtimeBackend + 本地 VFS/E2B 执行模型说明。
- 邮件触发/云浏览器 → InfoPane 诚实架构说明(飞书 Bot/webhook/定时触发;agent 端 Playwright)——
  axon 架构不同,标 ➖ 诚实说明而非假「即将上线」(非 false-pass)。
- traceability-matrix.md:Settings 功能对齐 ~40% → ~85%,红牌 #4 标已闭合。

Settings 10 子页现全部真后端/诚实说明,零假壳。组件测试 20/20 + ManusWorkbench 105 全绿,tsc 0。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
可追溯矩阵 P1「Database tab 占位空壳」的真实闭合(守门人:功能真实现非视觉假壳):
coding agent 常产出本地 SQLite(NotesSaaS/StripePay 等),右栏 Database tab 直接 introspect 它,
不依赖 Neon/gpt-5.5、不造假数据。

- 后端 routes/project-db-api.ts(复用 src/database/drivers/sqlite.ts SQLiteDriver):
  · GET /api/project-db?projectPath → 扫项目内 *.sqlite/*.db + listTables
  · GET /api/project-db/rows?...&table=Z → describeTable 列 + SELECT 真行
  · 安全:只读打开 / 路径限 projectPath 内(防穿越)/ 表名白名单 /^[A-Za-z_]\w*$/(防注入)/ limit≤200
- 前端 DatabaseTabBody:左表列表(按 db 文件分组,过滤 sqlite_sequence)+ 右列/行网格 + 诚实空态。
  接进 CodePane database tab(替换占位文本)。
- ★真数据验证★:curl 打真 /tmp 的 notessaas.sqlite → 真 users 表(id/username/password_hash/created_at)
  +真行(demo2);非法表名 users;DROP → 400;路径穿越 ../etc/passwd → 400。组件测试 4/4(真 API shape)。
- 矩阵更新:Database tab P1 红牌 + video 假阴性标已闭合。

ManusWorkbench 组件测试 109 全绿,tsc 0。云端 Neon 表视图待 publish-fullstack 链路(同范式换 PostgresDriver)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AvatarMenu.tsx:16 注释证明 Homepage/Get help/Docs 外链是有意省略(axon 无公开站,不放死按钮),
非「有但死」。矩阵 19-avatar-menu 行 + 红牌 #8 纠正为 ✅/➖。守门人纪律:纠正前先验证代码。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
design 图 inline 渲染、website/slides DeliverableCard、coding CodingPipelineCard——产物都可见;
仅 spreadsheet/research 文件没包下载卡 = P3。验证需 gpt-5.5 跑 mode。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
用户两条流程纪律落地(2026-06-03):
1. 双向对比应**先补文档参考系再补功能**(缺 spec 补 spec、缺高保真补高保真),此前直接补功能是本末倒置。
2. 每功能点「完成」唯一硬标准 = **UI 对齐 + UE 对齐 + eval 模拟点击验功能效果对齐**,写进每功能点验收。

- 正向缺口补 spec:新建 docs/spec/roadmap/M21-overview.md(access-tokens / Team[⚪记决策] / BaaS 可视化管理层 Auth·Storage·Analytics)。
- 反向缺口补高保真:新建 docs/prototypes/skill-composition.html(护城河「可组合技能」agent 原生组合的设计目标,Manus 无此能力 → axon 自己的产品愿景)。
- 矩阵升级:§0 写入「完成 = UI+UE+eval 三过」硬标准(eval=fireEvent/Playwright 模拟点击断言真实效果);
  §1 正向缺口行指向 M21/skill-composition;新增 §6「每功能点 eval 验收表」(已落地功能点→真测试文件 + 点击→断言效果;待落地→eval 契约)。

参考系双向完备 + 每功能点 eval 验收 = 守门人无盲区。eval 是「视觉像但功能空」黑洞的可机判焊死。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
对齐 20-composer-plus + 高保真 prototypes/skill-composition.html,护城河「可组合技能」用户入口
(Manus chip=单技能 → axon agent 原生组合多个)。按用户拍板的三条硬标准全过:

· UI 对齐:ComposerSkillMenu 菜单(添加本地文件 + 使用技能列表)+ ActiveSkillChips,对齐高保真。
· UE 对齐:点 +→菜单→点技能→激活 chip→可 × 移除;真前端截图验证。
· eval 模拟点击验功能效果:ComposerSkills.test.tsx 9/9(点技能→onToggle/点×→onRemove/添加文件回调/
  aria-checked/toggleSkill 纯函数)+ 后端 /api/skills curl 证 11 真可组合技能(slides/design/…)。

端到端真效果(不止 UI):选中技能 → chat payload activeSkills → websocket → conversation.chat()
合并进 state.activeSkills → 下轮 buildSystemPrompt 注入对应 SKILL.md 正文(agent 必用;不选则原生判断)。

新增 routes/skills-api.ts(runWithCwd 包 initializeSkills 解 cwd 上下文坑)+ 导出 COMPOSABLE_SKILL_NAMES。
矩阵:20-composer-plus ⚠️→✅;§6.2 该项移入 §6.1 已落地。ManusWorkbench 测试 118 全绿,tsc 0。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-5.5)

把 gpt-5.5 阻塞项「云端 Neon 表视图」的确定性核心现在落地+验证,遇真 Neon 即通(不造假壳):
- parseDatabaseUrl(url) → {type:postgres|mysql|sqlite, connectionString}(neon=postgres);纯函数。
- findEnvDatabases(root) → 扫项目 .env* 的 DATABASE_URL/POSTGRES_URL 等 → 检测非 sqlite 云库(只检测不连,安全)。
- GET /api/project-db 加 cloudDatabases;DatabaseTabBody 加云横幅「检测到云数据库…publish/可达后浏览」(诚实前置态)。
- ★三条验收★:UI 横幅 + UE(混合显示) + eval: project-db-api.test 8/8(URL 解析/.env 检测/去重/sqlite 排除)
  + DatabaseTabBody.test 6/6(含 2 云横幅) + curl 证真 postgres/neon URL 检测 + SQLite 路径无回归(notessaas 仍真)。
- 剩「真连接浏览云表」= createDriver(postgres) 走同一 introspection 范式(drivers 已存在),待真 Neon 可达。

ManusWorkbench+routes 测试 128 全绿,tsc 0。矩阵 §6.2 云端 Neon 标「核心✅/真连接待 gpt-5.5」。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②:给已实现但无测试的存量功能补 click-eval(模拟点击→断言效果),提升「每功能点 UI+UE+eval」覆盖。
BlueprintCard(构建前特性确认卡,护城河 user-in-the-loop)早已实现无测试 → 补 6 eval:
逐步导航 / 风格单选(换选+仍单选) / 能力多选 toggle / 立即构建回传正确 featureConfirm payload / loading 禁推进。
矩阵 web-05 改 ✅(三条全过);倒计时自动跳过标 战略不抄(自动起 LLM 耗 credits,axon 选显式确认)。6/6 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②续:给已实现但无测试的存量护城河卡补 click-eval(模拟点击→断言功能效果):
- DeliverableCard(每次交付卡)8:点卡片/仪表盘→onClick(entryPath)、⋯菜单、slides/website 区分、回滚条件。
- TemplatePickerCard(web-06/M10.e)6:点模板→onSelect(id)、选中/busy 禁交互、错误/空态。
- UiContractCalibrationCard(M11.d 红线#8)6:点校准→onStart、逐张✓/✗+批注+跳过像素、提交校准回传审批 payload
  (护城河签名:用户拍板 baseline,AI 不当裁判)。
连同上一提交的 BlueprintCard 6 → 4 张核心卡形式化三条验收。矩阵 §6.1 登记。ManusWorkbench 测试 146 全绿,tsc 0。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
存量护城河卡 click-eval 收尾:DesignDirectionPickerCard(M6 V2 HTML 设计方向探索)4——
渲染 N 方向/点「选这个方向」→onSubmit(chosen)/disabled 禁选/空态诚实。
至此 ManusWorkbench+components 全部交互卡(Blueprint/Deliverable/TemplatePicker/UiContract/DesignDirection)
都有正式三条验收 eval。tsc 0。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…门/协作卡形式化验收

守门人模板②续:核心护城河卡补正式 eval:
- CodingSpecCard(M6 spec 硬门,整条流水线契约)5:填齐 6 项→主按钮启用→确认回传正确 CodingSpec;
  逃生→onSkip;未填齐→主按钮禁用(全必填门);disabled 冻结。
- UserActionCard(M9 L4 user-in-the-loop)4:展示契约(标题/步骤/外链 href+noopener/验证/兜底/不留空壳);
  UE 由设计是 inline 阻塞条非交互,功能效果(阻塞至回复)由 m9-collab 套件验。
矩阵 §6.1 登记。tsc 0,测试全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e-more 对齐焊死

守门人模板②:chip=mode/skill 映射从 ChatPane 内联抽到 modeChips.ts(单一真源),
既是正确架构(防前端 chip 与后端 mode 漂移)又让映射可独立 eval:
- ModeChip 类型 + PINNED_CHIPS(4) + POPOVER_CHIPS(9) + findChipById 移入 modeChips.ts
- ChatPane 改 import + 反查走 findChipById(行为不变,tsc 0)
- modeChips.test.tsx 6 契约:常驻4+浮窗9=13(Manus 16-mode-more parity)/id 精确等于后端 mode 集合/
  id 唯一/非外链必有 prompt 模板(不留假对话框死 chip)/playbook 外链占位/findChipById 跨表反查
矩阵 §6.1 登记。预存在 7 失败(ContextBar/WebsitePreviewPane,不 import 我的改动)非我引入。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②:主区顶栏(曾删过头补回)补正式 eval(fetch 用 vi.stubGlobal 注入确定性 auth/quota):
- model selector「axon ▾」对齐 Manus 版位
- 未登录→「登录」按钮→点击→onLogin
- oauth 登录→字母头像(displayName 首字母大写)+点击 aria-expanded 展开菜单
- cloud 用户→积分 pill 真余额(formatCredits)
- builtin 账号→不假装 cloud 身份(走登录入口)
矩阵 §6.1 登记。tsc 0,5/5 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②:Manus 1.6 Lite 核心透明度 UE(用户持续知道 agent 走到哪步)补正式 eval:
- 摘要 done/total + 当前 doing 步骤标题(优先 doing>last done>first)
- 默认展开列全部步骤 + 1-based 序号;点 header 折叠(aria-expanded + body 行隐现)
- 空 steps 不渲染(不留空壳);error 步骤渲染 ✗(不掩盖失败)
矩阵 §6.1 登记。tsc 0,5/5 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②:信任叠加层常驻面板渲染+交互层补正式 eval(纯裁决逻辑 pipelineTrust.test 已钉):
- gating:null/非 coding 快照 → 不渲染(退出编程模式面板消失)
- UE:点 header 折叠;⚔工程/🏰王国 双镜片 aria-selected 切换
- 功能(M17.h 派活):断裂接缝(t2 done 依赖 t1 pending)🔴 → 「派活灭火」→ onDispatch(灭火指令);
  无 onDispatch → 纯观测有 🔴 提示但无死按钮
矩阵 §6.1 登记。tsc 0,7/7 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人模板②:用户自建 SessionTemplate 表单 modal 补正式 eval(fetch/alert 用 vi.stubGlobal):
- open=false 不渲染;✕→onClose
- 类别 网站→图片风格 → 模式候选联动重置为 design(防 mode 与 templateType 失配)
- emoji 点选 data-selected 切换
- 空模板名→alert 拦截不发请求/不 onCreated
- 填齐→点创建→POST /api/templates(body title 已 trim+cover emoji:前缀+mode 一致)→onCreated(data)+onClose
矩阵 §6.1 登记。tsc 0,6/6 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ite 挑选/编程5卡诚实展示

守门人模板②双卡:
- WebsiteRequirementsCard(护城河 website mode propose_website_builder)5:模板网格+intent+默认 suggestedTemplate;
  切模板/改下拉/填额外要求→Generate 回传完整 selection(trim);Cancel;disabled 冻结。
- CodingPipelineCard(M7/M8 编程流水线 5 时刻状态卡)7:核心验铁律「不掩盖」——
  非法 data→null/type 路由;verify_task 未过→❌「带红不许往下做」;测试门未过→失败命令;
  验收<100%→amber「不到 100% 不交付」;交付被双门卡→🚫卡点原因;交付成功→🎉+serverUrl 真链接(noopener)。
矩阵 §6.1 登记。tsc 0,12/12 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
kill136 and others added 25 commits June 3, 2026 10:57
…val — web-02/03 对齐焊死

守门人模板②:右栏 6-tab 从 CodePane 内联抽到 codeTabs.tsx(单一真源 + 纯展示 CodeTabBar),
让 web-02/03 工作台对齐可独立 click-eval(CodePane 整页含 Monaco 难隔离测):
- CodeTab 类型 + TAB_CONFIG + CodeTabBar 移入 codeTabs.tsx;CodePane 改 <CodeTabBar active onSelect>(行为不变,tsc 0)
- codeTabs.test 5:TAB_CONFIG 6 tab key/顺序精确对齐 Manus(预览/代码/数据/数据库/部署/设置)、'more' 不平级;
  点 tab→onSelect(key) 右栏切 body 根契约;active 高亮 class 区别
矩阵 §6.1 登记。tsc 0,5/5 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…的组件真实行为

守门人排查:工作树 7 个红非功能退步,而是组件重做后测试没跟上(stale)。逐一读组件确认当前设计正确后修测试(诚实修红不造假):
- ContextBar(2):组件已重做为极简进度条(Manus 风)——可见只留百分比、token 详情进 title tooltip,
  不再有 'ctx' 标签/内联 '13k/200k' 文本。测试改断言当前真实设计(占位填充条 + title tooltip)。
- WebsitePreviewPane(5):工具条按钮从英文文本(Reload/Open/Publish)重做为图标+中文 title
  (↻刷新预览/↗在新窗口打开/⬆发布),改按 title 定位(语义稳定);发布按钮从 disabled 占位(M4)
  重做为条件渲染(无 onPublish 整个不渲染=铁律不留死按钮),测试改断言不渲染。行为(_t bump/window.open/回调)全不变。
ManusWorkbench+components 全树零失败:39 文件 306 测试全绿。tsc 0。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-01 左栏对齐焊死

守门人重页展示层抽取(模板②延伸到重页):TaskListPane(940行,含模板/schedule/MCP/agents)整页难隔离测,
把核心会话历史行抽成单一真源 SessionListItem(纯展示+sessionStatusToDot),让 web-01 左栏行可独立 click-eval:
- SessionListItem + sessionStatusToDot 移入;TaskListPane 改 <SessionListItem>(行为不变,tsc 0)
- SessionListItem.test 6:状态点 messageCount>0/=0;点行→onSelect(id) 切 task;
  点 ✕→二次确认→onDelete(id) 且 stopPropagation 不穿透 onSelect;confirm 取消→不删(防误删);
  空 name→未命名任务;active 高亮 class 区别
矩阵 §6.1 登记。tsc 0,6/6 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eval — 定时任务/MCP 交互焊死

守门人重页展示层抽取(续):从 TaskListPane(940行)再抽 schedule/plugin 卡到单一真源 SchedulePluginCards:
- McpServerSummary/ScheduleTaskSummary 类型 + McpServerCard/ScheduleTaskCard 移入;TaskListPane 改用(行为不变,tsc 0)
- McpServerCard(3):name+type/tools;启用 ●/禁用 ○+变灰;点 toggle→onToggle
- ScheduleTaskCard(4):type 图标/标签(⏱一次性/🔄周期/👁监听)+上次运行徽标(✓/✗/⌛)+禁用态;
  点 toggle→onToggle;点 ▶→onRunNow(立即触发);type 三变体
矩阵 §6.1 登记(2 功能点)。ManusWorkbench 23 文件 193 测试全绿零回归。tsc 0,7/7。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人重页展示层抽取(续):从 TaskListPane 再抽模板卡到单一真源 TemplateCard:
- SessionTemplateSummary 类型 + TemplateCard + coverEmoji 移入;TaskListPane 改用(行为不变,tsc 0)
- TemplateCard.test 5:coverEmoji 解析(emoji:🎨→🎨/gradient·url→📋);cover/title/desc;
  official 无删除按钮/用户模板有;点卡→onPick(tpl);点 ✕→onDelete(event,tpl) 且 event 可 stopPropagation 阻穿透 onPick
矩阵 §6.1 登记。ManusWorkbench 24 文件 198 测试全绿零回归。tsc 0,5/5。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…发送 UE 焊死

守门人重页展示层抽取(最后一个重页 ChatPane 1873 行):把核心发送 UE 抽成单一真源 ComposerSendArea
(textarea+按键+发送按钮),+菜单/技能 chip 与 ChatPane 状态深耦合经 toolbarLeft slot 留父层:
- isSendDisabled/isSubmitKey 纯规则 + ComposerSendArea 组件移入;ChatPane 改用+删冗余 handleKeyDown(行为不变,tsc 0)
- ComposerSendArea.test 7:纯规则(空白/sending 禁用·Enter/Shift+Enter);打字→onChange;
  点发送→onSubmit;Enter→onSubmit(preventDefault)/Shift+Enter→换行不发;sending→textarea+按钮双禁用
矩阵 §6.1 登记。ManusWorkbench 25 文件 205 测试全绿零回归。tsc 0,7/7。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人精确盘点(awk 统计 §1 判定列):§1 正向矩阵 49 个映射点真实分布=38/49(78%)已解决
(31 三过+7 战略正确不做),剩 14 个里 ~10 blocked(gpt-5.5 下线/需真部署)、~4 低价值打磨。
不是「67%没做」而是「78%已落定,剩余多数=渠道下线期硬做会造假壳的活体项」。
诚实账反「29/89」机械误读:89 是更细粒度子项计数,§1 实际映射点 49,✅占 63%、含战略不做共 78% 落定。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
守门人方法论闭合(「先写 eval 契约,按此实现+验收」):给所有剩余 §1 ⚠️/🔴 点补 eval 契约:
- building 进度 UI(web-04):前端可做(mock 事件)+接 live loop 验
- Websites 计费明细(40):M15 埋点+真部署
- Delete account(44):⚪ NewAPI 红线(账号是 NewAPI 域,需其销户 API 不自建)
- 模板 Add reference/Figma(web-06):Figma API+产品决策
- design/spreadsheet 交付卡扩到 research/viz 4 mode 各一条
现在每个剩余点都有可执行的三条验收门——gpt-5.5 恢复后下一程按契约直接执行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…一键部署流焊死

守门人严格复查抓到漏网的活体真交互面:DeployTabBody(CodePane 内联,部署状态机)无 eval。
不依赖 gpt-5.5(/api/files/deploy 是本地端点可 mock),补三条验收:
- 抽到 DeployTabBody.tsx 单一真源(纯内联样式自包含);CodePane 改 import(行为不变,tsc 0)
- DeployTabBody.test 5:idle 标题/按钮;点部署→done(成功卡+真 URL+elapsed+打开/复制,POST body 带 projectPath);
  失败(ok:false)→失败卡+错因(不粉饰);点复制→clipboard.writeText(完整 URL);点下载 ZIP→建 a 打 export-zip
矩阵 §6.1 登记(web-02 Deploy 从✅无eval→有eval)。ManusWorkbench 26 文件 210 测试全绿零回归。tsc 0,5/5。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
铁律6 第二次复查证伪「活体 eval 做尽」:CodeView 下还有活体护城河组件无 eval(被 CodeEditor/WebsitePreviewPane 用):
- EditsProgressBubble(M.3.b website 可视化编辑进度气泡)7:phase/start/result/error 映射文案+颜色+role=status;
  enabled=false/null→unmount;result·error 3 秒淡出;★error 标红+部分成功(ok:false)不假装全绿(不掩盖编辑失败)★
- SemanticMap(编辑器语义地图导航)5:图标按类型(📦/📐/🧩/⚡);点区块→onNavigate(line) 跳转;
  currentLine 在范围→active 高亮;空态诚实
教训:「做尽」判断必须反复复查证伪,连续两轮都抓到漏网活体面。矩阵 §6.1 登记。tsc 0,12/12 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eView 组件

铁律6 持续复查:CodeView 下活体可测组件继续补 eval(不依赖 gpt-5.5):
- FilePreviewPanel(办公文档预览)5:image→img/pdf→iframe/未知→Unknown;下载 URL path/root 正确 encode(防注入);
  无 projectPath 不带 root(excel/word 走真 XLSX/docx 解析,不测重解析)
- SearchPanel(编辑器全局搜索/替换)4:输入→debounce 500ms→POST /api/files/search(query+root);
  大小写/全词/正则 toggle 反映进 body;空 query→不发请求
真正剩余的不可测=CodeEditor(Monaco)/SimpleTerminalTab(xterm)/FileTree(1837 递归)——jsdom 无法有意义测或需大改造。
矩阵 §6.1 登记。tsc 0,9/9 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
铁律4 敢说不对(含自己的错):上一提交把 SearchPanel 当活体 web-02 搜索补 eval,自查发现:
SearchPanel 仅被 CodeView/index.tsx 引用,index 仅被 App.tsx(display:none 遗留隐藏树)引用
→ 不在活体 ManusWorkbench 树。活体编辑器搜索=Monaco 内置 Ctrl+F;项目级 SearchPanel/
CompactChatPanel/CompactMessage 都是遗留死代码。测死代码=假覆盖([[feedback_root_hidden_app_panel_trap]] 同坑),删之。
保留 FilePreviewPanel/SemanticMap(核查是真活体,CodeEditor 直接 import)。
教训:补 eval 前必先验组件被活体树触达,别只看「有引用」(引用方也可能是死树)。矩阵记录纠错。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
复查再纠正:FileTree 标「重 tier 整测不了」不等于「测不了」——它的逻辑核心是 6 个纯函数,
路径运算/树查找/懒加载合并/键盘导航,bug 高发。导出后不渲染递归树就能钉死:
- getParentPath(路径父目录) / isDescendantOf(拖拽安全:防目录拖进自己子树,'srcX'前缀像但非子)
- collectAllDirPaths(展开全部只收目录) / findNodeInTree(按路径查找)
- flattenVisibleNodes(键盘导航:仅展开目录的子节点可见+level 递增)
- mergeSubtree(懒加载:替换匹配路径节点其余不动)
教训:「重 tier」是指 RENDER 重(Monaco/xterm/递归),不代表逻辑核心不可测;先拆纯函数再判。
矩阵 §6.1 登记。tsc 0,7/7 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…测逻辑核心

复查再证伪「Monaco 测不了」:CodeEditor RENDER 是 Monaco(jsdom 炸,且传递 import xterm→self undefined),
但文件路由是 3 个零依赖纯函数,bug 高发。抽到 editorFileUtils.ts(不传递 import Monaco/xterm)后可独立测:
- getFileType:扩展名→走 Monaco vs 预览面板(image/pdf/excel/word),未知→code 不误判成二进制
- getLanguage:→Monaco 语言 id(19 映射),未知→plaintext 兜底
- getFileName:兼容 / 和 \,无分隔符返回原值
教训:「Monaco/重 tier 测不了」指 RENDER,逻辑核心抽成零依赖纯模块就能测;直接 import 组件会被 xterm 的 self 炸,必须抽 util 模块。
矩阵 §6.1 登记。tsc 0,5/5 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…JSON 契约焊死

复查持续高产 + liveness 教训生效:广扫活体未测组件纯函数,ArtifactsPanel(9 纯函数)无 importer=死代码跳过;
ChatPane(活体)的 4 个消息构造器是真契约:点 spec 卡确认/逃生/选设计方向/确认网站需求→拼带 marker 的
agent 消息,后端 conversation.ts 据 __coding_spec_confirmed__/__design_direction_chosen__ 等 marker 解析落 spec.json。
marker 拼错/JSON 格式错=后端解析失败=点卡片没反应(隐蔽 bug)。抽 composerMessages.ts(零 React)+6 测:
- marker 末行存在 + JSON round-trip 回完整 spec;expectedDeliverable 条件行;逃生 marker
- 设计方向 JSON(directionId/title/summary/htmlPath);网站需求 id→name 查找+未知回落+initialize_project 带 templateId
矩阵 §6.1 登记。ManusWorkbench 27 文件 216 测试全绿。tsc 0,6/6。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
把「对齐 Manus」从活在人脑的 vibe 做成 red/green 可执行门系统。新增
*.manus-alignment.test 约定:fixture=Manus HAR/截图实拍 + 每条断言 cite 抓包来源,
区别于临时 fixture 的机械 click-eval(后者守「功能不空壳」,前者守「没偏离 Manus」)。

- C 层(人手):BlueprintCard 6 契约(MathBuddy confirm_webdev_feature HAR)
- F 层(agent 自产 + 主进程独立认证):AvatarMenu/SettingsModal/modeChips/
  TemplatePicker/ComposerSkills 各 6 契约,1 message 并行派 agent 读截图自抽
- 双轴认证(不信 agent 嘴):①牙齿=变异测试,注组件变异→精确变红其绑定契约
  →git checkout 还原回绿;②grounding=主进程亲核源截图确认 agent 没看错
- 揪出真 bug:CLAUDE.md/modeRegistry.ts 误认「schedule/chat 是 axon 加」,
  实证 16-mode-more.png Manus「More」浮窗本有 Schedule tasks + Chat mode,已纠正

矩阵 §0.2 立方法论锚点(牙齿 vs grounding 两轴 + deliberate-skip 骗绿风险)
+ web-05/M20.a 行 + §6.1 条;D 层覆盖账 find -name '*.manus-alignment.test*' = 6。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ding bug

A/D 层(reference 新鲜度):
- docs/manus-parity/reference-manifest.md —— 固化「9 oracle ↔ 70 capture+年代 ↔ 编码的 Manus
  事实(含 deliberateSkip) ↔ 18 条重抓清单 ↔ drift-diff 流程」三向映射,丢一张新截图 30 秒
  定位要重验哪些单测。含 live-API 已解项(§4.5:用户 Pro token 直查 api.manus.im 覆盖
  账号/额度/skill/模板/定时,schedule 经 ListScheduledTasks 二次 live 实证)。
- 修 2 个 grounding bug(A/D 审计回读真截图对抗验证):
  · C1 残留:PRD line 108/113「schedule/chat 是 axon 加」→ 实为 Manus 本有,纠正
  · C3:matrix line 82 模型选择器「Lite/Pro/Max」→ 实为 Max/1.6/Lite(Pro 是付费徽章非档名)

F 层(D 层覆盖账 6→9,53 契约双轴认证):
- 新增 3 个 agent 自产 + 主进程双轴认证(变异测牙齿 + 亲核截图 grounding)的对齐 oracle:
  WorkbenchTopBar(5) / LibraryView(6) / DatabaseTabBody(6)
- DatabaseTabBody 焊死老红牌「Database tab 占位空壳」:oracle 绑死真表浏览器(users/customers
  真列真值 + Manus Auth 子tab + 无数据诚实空态不造假表)
- grounding 轴枪毙 SchedulePluginCards 弱 oracle:Manus 是配置卡 / axon 是管理卡两形态,
  契约硬 cite 不实=假覆盖,删之(质量>数量)。schedule 配置=AI-native NL vs picker 形态分歧

矩阵 §0.2 同步:oracle 账本 9 行 + grounding 轴拒绝弱 oracle 纪律。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
D 层覆盖账 9→12(71 契约双轴认证)。给 Settings 子页补 agent 自产 + 主进程双轴认证
(变异测牙齿 + 亲核截图 grounding)的对齐 oracle:
- SettingsDataControls(6):绑真删会话(/api/sessions GET 计数 + DELETE 清除 + 二次确认);
  grounding 亲核 31 截图实为 6 卡资源网格(非数据训练 toggle,纠正了误设)
- SettingsUsage(6):绑真接 NewAPI /api/axon-cloud/quota(三态诚实 loading/失败/无数据不造假数字);
  不抄 Manus Stripe 套餐分级(正向断言);未建子tab 诚实「即将上线」占位不伪造明细
- SettingsPersonalization(6):绑 Profile 真表单→localStorage→ChatPane.readProfile→manus-prompt
  注入闭环(M20.c);Knowledge tab 诚实占位

意义:§2 #4「Settings 6 占位壳」红牌 2026-06-03 已闭合但仅文档声称无门守 → 这波把「已闭合」
从一次性人审升级成持续 red/green 门,谁改回占位壳即红(防回归)。

矩阵 §0.2:oracle 账本 12 行 + 第4波「给已闭合红牌装门」纪律。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
用 token 跑 playwright-core 复拍当前真 Manus(2026-06-04) mode 浮窗:pinned 4 + popover 9
与 2026-06-02 的 16-mode-more.png 逐项完全一致 = 零 drift。modeChips oracle 的 grounding
截至 2026-06-04 重新确认有效、drift 时钟重置。附带印证 C3(Pro 顶栏 pill 显示 Manus 1.6 非 Lite)。

意义:A/D 层「回真 Manus 重观测」那个不可机械化核心,对最高 drift 风险单元(mode chips)
真跑通一次完整闭环——证明 reference-manifest §5 的 drift-diff 流程可操作。
manifest §4.5 记录 R1 已执行 + 方法(浏览器复拍,token 走 env 不落盘)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3 个活面 oracle 双轴认证(主进程注 3 变异恰红 3 契约·还原 17/17 回绿 + 亲核
02-app-home/workbench-two-pane 两图): TaskListPane(左栏 5 项导航/Scheduled New
徽章/footer 去 Meta 化)6 + codeTabs(Computer 6 tab/deploy 替换 files 护城河)6 +
SessionListItem(状态点+标题/running vs idle/confirm 删除)5。D 层覆盖账 12→15,71→88。

本波最大产出=grounding 预筛挖出新陷阱「死面/活面」:FollowupSuggestions/PlanPanel
grounding 最硬但 server 零 producer(grep 实测)=真实产品永不渲染的死面,给死面装绿
oracle=新版假覆盖。新子纪律:oracle grounding 须「截图有」+「axon 真渲染(有 producer)」,
缺一即记账不装。把守门人「完成=真前端能用」下沉进 oracle 准入门。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…acle

用 Pro token 浏览器复拍真 Manus 交付卡(web-14-delivery-card-2026-06-04.png),本为解锁
DeliverableCard oracle,复拍反而抓出 axon 制品卡 chrome 偏离真 Manus(真 Manus=步骤汇总卡
✓+5/5+折叠+右栏发布预览,无回滚;axon=IDE 风制品卡+⋯菜单+git 回滚)。旧口述参照掩盖偏差,
回真 Manus 复拍抓出来=E 层 grounding 第二次实证价值(R1 零 drift / R15 抓真偏差)。

用户拍板记分歧+锁护城河:写窄·护城河型 oracle(4 契约)只锁真共享(缩略图/点开)+真护城河
(git 回滚,Manus 实拍证无),不锁 chrome。我自注 2 变异(回滚守卫/标题)恰红契约3/4,还原 4/4 回绿。
纪律细分:chrome 偏差单元≠一律不装——全偏差(SchedulePluginCards)不装,偏差但有真共享+真护城河
(DeliverableCard)装窄 oracle 防重构丢护城河。D 层覆盖账 15→16,88→92。

安全:token 走 env 不落盘,复拍后清 /tmp 账号截图/视频,并删上个 session 残留 token.txt。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eliverableCard 混合重设对齐 Manus

M19.b/c producer 接活(gpt-5.5 渠道恢复后实证)—— FollowupSuggestions/PlanPanel 从死面升活面:
- plan_update = 复用 agent 原生 TodoWrite 映射(★驳 spec D2 新造 declare_plan = 重复造轮子,铁律2;
  TodoWrite 已被 conversation.ts 拦截、prompt 已叫 agent 用它跟进多步)
- suggested_followups = 新 suggest_followups marker 工具(仿 report_progress 范式)
- 映射真值抽 narrative-producers.ts 纯函数 + 9 单测焦死契约;plan_update/new_plan_step 进 ServerMessage union
- live-narrative eval(M19.f) 加 case 跨边界实证 plan_update×5 + suggested_followups×1 真到 ws 流

DeliverableCard chrome 混合重设(用户拍板「Manus 外形 + 护城河抽屉」,plan_update 接通后步骤汇总外形才有数据基础):
- 采 Manus 步骤汇总外形(✓ 完成勾 + 折叠 chevron);真 git 回滚提到展开抽屉第一公民(不再藏 ⋯ 菜单)
- 对齐 oracle 4→5 契约(新增契约5 正向锁采纳了的 Manus 外形;chrome 偏差从「记分歧不锁」收敛成「正向对齐」)
- 变异认证恰红契约3(护城河)+5(外形);机械测 8→9(删 ⋯ 菜单断言、加 chevron 折叠断言)

回归门:8/8 官方基线套件符合(含最重 m8 5/5、prompt 敏感 prompt-refactor 5/5)。m5 9/10 唯一 miss =
m5-not-upgrade-research 的 codex-stall 超时(flaky,非逻辑破,自愈重试都救不动)。slides-deck(不在官方 8 套基线)
失败经 baseline-prompt 隔离复跑证明与本改动无关(去掉我 prompt 同样超时 = 当前 gpt-5.5 全局负载环境问题)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ing 根治)

用户看到空状态主屏有黑底「222」野盒子,问「干这么多活竟连聊天都有 bug,是开发能力问题吗」。诊断=不是写代码能力,
是验证方法论:全套验证(16 对齐 oracle / M5-M19 / 回归门 / 38 单测)都在测「我造的功能对不对」,从没有一个测试
加载组装后的真前端看「用户第一屏干不干净」。而「打开看一眼」一直是 prompt 自觉(~50% 遵守)—— 正是 M5-M9 教训
「结构化硬门 > prompt 祈祷」。

修:evals/suites/frontend-health/run.ts(playwright-core + vendored chromium 加载真 :3456 空状态主屏),接进
evals/regression.ts 第一位先跑(无 LLM ~15s)。检查:
- 零 pageerror(未捕获 JS 异常)
- 无野数字浮层(「222」类:fixed/absolute + direct text 裸数字,allowlist 排除 commanderFab 等合法浮层)
- 主屏骨架在(composer + 左栏 5 nav)
- 无新增 console/网络错(已知 2 个 404 /live-history + /api/files/read 透明 allowlist,每跑打印命中数+TODO,非隐藏)
- 强制截图留档供人过目

★自证有牙齿(双轴认证,绿不算数):注入假「222」黑底浮层 → 探测器精确变红。
★诚实边界:localhost 跑已提交代码复现不出用户的「222」→ 是浏览器扩展 或 52.54 跑别的 build。这本身又是一条根源:
  用户看的(部署+扩展) ≠ 我验的(localhost headless),无「此刻产品长啥样」的权威视图;门正是钉死机器化权威视图。
门首跑即抓到 2 个真 404(主屏 load 噪声,所有 milestone eval 都漏)待修。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
用户实锤「聊天功能有bug、前后端接线有问题」。真前端逐帧 + 日志 + 数据库三处核查定位:后端/ws/LLM/落库**全正常**
(数据库存着正确回复,text_delta 流式帧全到前端),但**助手回复在 UI 一条都渲染不出来**——纯前端,3 个 bug 叠加:

① chat_start ≠ message_start(气泡根本没创建):ChatPane 监听 'chat_start' 建助手气泡,但后端全仓只发
   'message_start'(ServerMessage union 也是 message_start)→ 死分支永不触发 → 气泡不创建 → text_delta 无处可填。
   [[project_m18_frontend_backend_contract_spec]]「前端 msg:any 让对不上的死分支编译期蒙混」的活标本。

② session 隔离过滤器读陈旧 prop:首条消息时后端建持久 session,用新持久 sessionId 发 message_start/text_delta,
   但 ChatPane 过滤器比的是 currentSessionId **prop**(React 异步还没更新,仍是 temp id)→ 整个流式响应被当
   「别的会话」丢弃。改用 currentSessionIdRef(遇 session_created 在过滤前同步更新成新 id)。

③ live-history 回放在流式中途清空 messages(致命):首条消息 → currentSessionId 变 → 「切 session 拉历史」
   effect 触发 → setMessages([]) 把**正在流式的助手气泡冲掉** + fetch /api/sessions/<id>/live-history(刚建的
   session 此端点 404,就是 frontend-health 门 allowlist 的那个 404)→ 回放成空/只剩用户消息 → 助手回复消失。
   修:sendingRef 守卫 —— 发送/流式途中的 session 变化是「当前对话拿到持久 id」非用户切会话,跳过历史回放。

★为什么全套 eval 绿却产品坏★:所有 eval 用 node ws-harness 直连后端、断言线上事件,**从不渲染真 React 前端**,
更不走「temp→persistent 首条消息 session 切换 + 浏览器渲染」这条真实路径。这正是用户「vibe coding」批评的最深证据。

真前端验证(playwright 真发消息):单条 ✅「杭州是一座…历史文化名城」渲染;多轮 ✅「1+1=2」→「再加3=5」上下文正确。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…g 漏网)

frontend-health 原本只查空状态主屏。但 2026-06-05「助手回复一条都不渲染」3-bug(commit 74e12bb)证明:聊天
本身坏掉、后端/ws/LLM/落库全绿,空状态门照样过。根因=所有 eval 用 ws-harness 断言线上事件,从不渲染真 React
前端、不走「首条消息 temp→persistent session 切换 + 浏览器渲染」真实路径。

加 chatRoundtrip 检查:真发「1加1等于几」,断言助手 chatBubbleAssistant 出现**非占位真实文字**(≤40s)。这是
「聊天到底能不能用」的唯一真前端证据。有牙齿实证:修复前同一断言返回空(助手永不渲染)、修复后返回「2」。
LLM 依赖较慢但值得 —— 它拦的是「整个聊天功能坏掉」这种最致命、最该第一时间发现的回归。

体检门 6/6 pass(空状态 5 + 聊天往返 1)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@kill136 kill136 merged commit d50798e into main Jun 5, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant