Files
makelore/.project-docs/30-worklog/tasks/20260924-agent-rendering-a8c2d419.md
T

63 lines
9.5 KiB
Markdown
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.
# Task: Fix consultation response rendering
## Identity
- Task ID: 20260924-agent-rendering-a8c2d419
- Mode: Feature
- Branch: codex/20260924-agent-rendering-a8c2d419-agent-rendering
- Worktree: D:\Datas\OthersProjects\.codex-worktrees\makelore\20260924-agent-rendering-a8c2d419
- Base commit: 0a8fce67a4ea6de291f82c09c17d3efe0ea7b92c
- Owner: codex
- Status: Ready for Integration
## Scope
- 修复用户截图中的咨询面板渲染:空旧草稿导致数字 0;定位序列化项目上下文进入智能体回复的问题。云端事件生产问题在独立 Yuxi 任务处理,客户端随后按用户要求完善回答解析、富文本和工具活动展示。
- 后续用户追加“这次回复没有整理完整 / 这次整理没有完成”的截图,继续同一回复渲染任务,核对结构化回复解析;先前产品修复提交 3c68155 保留且尚未合并部署。
- 2026-09-24 用户进一步要求参考 Yuxi 问答页面完善客户端数据适配、解析和渲染。继续本任务:区分正常 Markdown/JSON 示例与讨论协议,使用专门的正文渲染,保留解析失败的可检查原文;只投影工具身份与状态,不改变云端正文 string 合同,不以此声称找回两条已丢失回答。
## Intent And Constraints
- maintain-project-docs 与 diagnosing-bugs 已加载。官方 check/start/status、项目记忆与 peer scope 检查完成,Concurrent/Planning Gates Passed;Feature 模式仅写本人记录和必要产品/测试文件。
- 保留用户话题原文,不批量替换转义字符,不以 JSON 外形猜测并删除回复。线上事件探针被自动审批以 blocked by policy 拒绝,已停止该访问方式,改用本地数据和真实协议测试。用户随后批准创建 1 个全新只读 Reviewer,已委派两端补丁审查。
## Outcome
- 已从本地历史确认异常回复含序列化上下文;Yuxi 对非 AI 消息的错误投影在关联任务修复,客户端不添加猜测式内容清洗。
- 空旧草稿条件显式转换为 Boolean,避免 references.length 为 0 时作为 React 子节点显示。保留有内容的旧草稿入口,产品流程不变;README 无需改变。
- 两条历史格式错误的原始回答无法还原,仍不能声称找到其唯一根因。用户随后授权按 Yuxi 问答方式改进渲染,已建立受支持内容的独立回归:7种 Markdown/JSON/代码示例误判及1项纯文本渲染失败先红后绿。
- discussion-v1 的 parser 仅识别顶层 reply/quickReplies/tool 字段或专用围栏。Markdown 链接、普通 JSON 对象/数组、嵌套 reply 数据与 JS 示例保持正文;保留原有有效 envelope、完整 reply 恢复及组件生命周期校验。
- 新 TeacherReply 复用已有 ReactMarkdown、GFM、KaTeX 依赖,支持标题、列表、表格、代码、HTTP(S) 链接/图片与公式;代码/表格栏内滚动,图片失败显示替代说明,HTML不执行,代码中的字面转义不全局替换。链接复用现有 Main-owned 打开接口,未新增依赖。
- 解析失败时保留可恢复正文与旧讨论卡,同时将完整 unparsedResponse 持久保存为默认折叠的字面内容。Main 的后续会话文本只取 response,不重复注入诊断副本。旧版已经覆盖的原文不能恢复。
- 工具活动来自实际主线程 SSE typed tool events 或 Main 三项本地读取,按 run/call 合并与去重,独立折叠显示名称/状态;不复制 args、args_delta、output、error 或 reasoning。完成后尚无结果的调用显示“未收到执行结果”,不假称成功。只记录本客户端观察到的活动,不补写已过期云端事件/旧话题。completed output非string明确返回格式错误,不猜测拆包。
## Verification
- pnpm exec vitest run tests/unit/coding-teacher-ui.test.tsx -t 'does not render a zero' --maxWorkers=1:预期失败,复现截图数字 0。
- pnpm exec vitest run tests/unit/coding-teacher-ui.test.tsx --maxWorkers=1:30 passed。
- MAKELORE_LAYOUT_BROWSER_CHANNEL=msedge pnpm exec playwright test tests/e2e/teacher-discussion-layout.spec.ts --grep ordinary:319/508px 两个真实浏览器页面用例通过,使用现有隔离页面与模拟 API。
- pnpm run typecheck、三处改动文件的 eslint、pnpm run build:vite、git diff --check:通过。构建仅有既有 chunk 大小及动态/静态混用提示。
- 官方 check_doc_drift.py:Feature 文件所有权边界通过。未打包、安装、合并、推送或部署;未进行线上收费对话。
- 用户授权的全新只读 Reviewer agent_rendering_review 独立审查 PASS,无 findings;复跑客户端 30/30、Yuxi 55/55 通过。已目视核对508px页面截图,无数字0,回复/草稿/快捷提问显示正常。
- 追加截图诊断:官方 start/status 已恢复同一任务;复用未变项目记忆及113项既有scope,补读新增只读Reviewer记录,Concurrent/Planning Gates再次通过。精确匹配本地13:17的两条问题,均为discussion-v1/completed,只有固定INVALID_REPLY和INVALID_TOOL被落盘,未存模型原文;读取仅限用户报告的项目话题。
- 当前代码将 structuredText 交给 applyDiscussionReply 后覆盖 response,失败时不保存原始回答。截图两种提示并存,说明没有提取出有效reply且结构化解析/组件校验失败;单纯云端output非string或为空只会产生INVALID_REPLY,不会额外产生INVALID_TOOL。未掌握原始输出,不把格式错误、截断或解析误判中的某一种说成已确认根因。
- 现有Reviewer独立核对final-output合同:teacher request_view返回run_id,客户端随后读取run_view;get_agent_run_result.output来自同次output_message.content(Text string),checkpoint最终AI内容按字符串或text block抽取,无messages transport wrapper。structuredReply只传入完成态该字符串,字段/类型合同一致。故没有证据支持接口字段适配或猜测式parser补丁。
- 本轮用户授权的渲染改造:同一任务 check/start/status 与 Planning Gate 再次通过;114个owner身份集合未变,补读已有Reviewer最新记录,113个peer无语义冲突。复用现有只读reviewer调查Yuxi Web MessageProcessor/MarkdownPreview与老师SSE,没有创建新智能体。
- 红测命令:pnpm exec vitest run tests/unit/teacher-discussion.test.ts tests/unit/coding-teacher-ui.test.tsx -t 'preserves Markdown|renders assistant Markdown' --maxWorkers=1,8 failed,实际显示INVALID_REPLY/INVALID_TOOL并找不到Markdown heading。修复后全部通过。
- 最终相关单测:pnpm exec vitest run teacher-discussion teacher-cloud-activity coding-teacher --maxWorkers=1:8 files / 287 passed;覆盖正文格式、代码转义、公式/图片、无HTML执行、工具字段投影/子线程过滤/重放、真实Main工具续接、状态落盘重读、失败原文落盘与上下文排除。
- 最后复审发现 Yuxi 真实 tool-finished/tool-error 只带 tool_call_id,不重复名称;纠正初步合同核对中的工具名假设。3项真实shape测试先红,修复为按run/call关联既有名称并支持tool-error,再全相关287项通过。最终重新build通过,扩展Main tsc的66条输出与修复前逐字一致。此处源于实际生产者/audit测试,不是虚构兼容格式。
- 现有独立Reviewer最后复审PASS,无剩余阻断finding;独立复跑adapter/runner两文件33项通过,确认失败原文不会经teacherHistory/read_conversation重新投影、工具终态与子线程隔离正确。本人task-aware文档漂移门禁及diff-check通过;本任务可交付集成,源码验收与线上部署验收分开。
- Renderer typecheck、changed-file ESLint、build:vite通过;Main扩展检查 pnpm exec tsc --noEmit --composite false --incremental false -p tsconfig.node.json 仍为既有66条诊断,本次teacher模块无诊断,不宣称全量Main类型通过。构建仍有既有chunk及混合import提示。
- MAKELORE_LAYOUT_BROWSER_CHANNEL=msedge pnpm exec playwright test tests/e2e/teacher-discussion-layout.spec.ts:12 passed;覆盖319/508px富文本、已有四类讨论卡、草稿与固定输入框,目视检查319px截图通过。真实浏览器+模拟接口,不是已安装客户端/线上模型验收。
## Follow-ups
- 本轮实现、本地验证与最后只读复审完成,不需要再次索取旧原文来完成已授权的渲染改造。若用户补交原始回答,可另行核对原截图精确原因。
- 部署 Yuxi 并更新客户端后才能影响用户当前安装,部署后验收一次真实提问及只读工具续接。历史异常原文保持不变。当前仅交付任务分支修复,不含合并或部署。
- 不重试已拒绝的凭据/云端事件探针。新的 parser 变更依据本轮明确复现的普通内容误判;不将上轮角色过滤或本轮渲染修复表述为已验证解决两条已丢失原文的线上错误。
## Promotion Candidates
- Target: 10-decisions/ADR-2026-09-22-coding-teacher.md、20-architecture/system-overview.md。Proposal: 记录正文Markdown渲染、明确业务协议判定、解析失败原文默认折叠留存及工具元数据独立展示。Evidence: 用户本轮明确授权、287项测试与12项布局用例。Future impact: 后续新增多模态/工具渲染应有真实类型合同,不能按正文外形猜测;不改变学生计费、版本或文件权限。Semantic conflicts: README原“不展示模型原始JSON”改为正常正文不展示协议、失败可主动展开原文,现用户授权已覆盖。Human confirmation: 本次实现无需;canonical promotion待Integration Gate。