Files
makelore/.project-docs/10-decisions/ADR-2026-09-22-coding-teacher.md
brother7 a21a1f077c
Some checks failed
Electron E2E / Electron E2E (macos-latest) (push) Has been cancelled
Electron E2E / Electron E2E (ubuntu-latest) (push) Has been cancelled
Electron E2E / Electron E2E (windows-latest) (push) Has been cancelled
Merge remote main and reconcile agent refresh with ongoing chats
2026-09-28 15:02:09 +08:00

44 lines
11 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.

# ADR: 官方编程老师与项目会话导航
- Status: Accepted / implemented, single ongoing chat amended 2026-09-28
- Date: 2026-09-22
- Approval: 用户确认项目默认 Agent、项目下会话、多老师列表与移除试聊;随后确认使用 Yuxi 原生智能体、客户端提供三个只读工具、沿用学生账号付费,并要求实施及合并。2026-09-24 明确取消客户端固定老师/朋友分类,统一使用后端下发智能体,并要求合并上下文预算修复。
## Product Positioning
2026-09-26 用户明确确认并进一步澄清:老师 Agent 是某一领域杰出人物的能力转化而成的智能体,供平台学生使用。定义以人的领域能力及学生价值为中心,蒸馏属于实现方法。能力来源、能力内涵、学生价值与真实案例验证标准集中记录在[产品定位](../00-brief/project-positioning.md#老师-agent-的产品定位)。下列云端执行、上下文读取与咨询交互决定服务于这一能力交付;客户端统一智能体模型保持。
## Decision
- 2026-09-28 用户确认像微信联系人一样,每个账号与每个下发智能体只有一个持续聊天,并授权实施与合入主分支。以稳定 config_id 标识智能体,不按名称、默认标记、项目或版本创建第二个可见聊天;本次范围为本机持久化,不含跨设备同步。
- 新项目创建内部默认编程 Agent 并保存 defaultAgentId,会话直接列在项目下。打开项目不自动创建空会话,首次发送或显式新建才创建;历史 Agent ID、配置和 Pi 会话绑定保留。
- Yuxi 拥有老师提示词、模型和所选 Skills、知识库、MCP、子智能体。Works Square 运营菜单首先展示下发列表,添加时从 Yuxi 选择并发布当前配置,支持多位、默认选择与启停,不维护第二份提示词编辑器或试聊界面。
- 运营显式同步 Yuxi 配置产生不可变下发版本。每次接受新问题使用当前已下发版本,运行中的问题保持原版本;版本变化不另建可见聊天。配置与资源绑定固定,Skill 按问题建立运行快照,知识内容和远端工具仍由各自服务拥有;资源撤销可能阻止执行,版本不表示复制全部外部资源。
- Yuxi 原生 Request/Run、PostgreSQL checkpoint 和 Redis 事件拥有云执行。Main 冻结本次账号、项目、来源 Pi 已完成分支的公开消息及老师话题,通过三个只读工具提供目录、UTF-8 文件行段和会话原文。文件按读取时内容提供,会话按本轮快照读取,不上传完整工程、Pi 原始日志或思考。
- 本地工具只交给老师主线程:云端持久中断完整批次,Main 主动回传配对结果,关联 Run 续接同一问题。用户于 2026-09-27 授权改造读取工具:声明 read_protocol=2 的客户端支持按层目录与连续原文分页,每问题最多 12 批、成功结果累计 64 KiB、单页 8 KiB,剩余不足 512 字节时收尾;旧客户端保持六批。最后结果消费后显式禁止继续选工具并要求基于已有证据回答。保留原付款人、版本、上下文和截止时间;读取限当前项目,允许 .makelore/project.json,排除其余内部记录与 Git 数据,不提供本地写入或命令。
- Works Square 验证学生编程资格,使用专用短期老师凭据;聊天模型费用记入学生 ai_programming / coding_teacher 账本。老师资源仍归 Yuxi 创建者,个人 Agents 模块继续创建者付费,老师问题不占创建者个人智能体金额上限。
- 云端保存执行线程、消息和收到的片段。Main 在 userData/agent-conversations/<account>/<agent> 保存轻量聊天索引和独立轮文件;每页50轮,流事件只更新当前轮。轮文件先于索引原子保存,恢复不重发模型。停用阻止后续调用,历史仍可查看;重启将未完成问题标为中断,下次提问先停止旧问题。
- 每轮冻结项目、Pi 来源、发布版本及只读范围。相同项目/来源/版本沿用内部 Yuxi 线程,任一改变都开启内部执行段,携带有预算的公开近期交流;可见聊天保持连续。历史消息可按 ID 读取,读到另一项目的旧交流不授予其文件权限。Pi 与项目配置仍归项目所有。
- Code 咨询统一使用服务端下发智能体,不内置老师/朋友角色、本地教学人设或按名称分配的工具权限。名称、头像、简介、欢迎语和推荐问题来自发布定义。所有下发项共享上述只读工具边界,通用讨论组件协议不定义智能体人格。
- 结构化讨论在聊天内按项目保存,历史轮保留原卡片快照。正文、历史和带回草稿仅接收云端主线程文本;子线程事件仍推进续传游标。带回回答只追加原项目/Pi 来源的草稿,不自动发送或改写当前其他来源。已下发智能体的旧 Renderer 定时跟进停止派发;新的 Main 主动观察由独立任务实施,本次未接入建议投递,后续必须并入同一聊天,不能恢复项目话题入口。
- 所有下发智能体以头像和名称在顶栏并排展示,溢出横向滚动。点击恢复唯一聊天或空态、独立草稿和未读,不调用模型;移除新话题加号和话题下拉框。旧原始记录保留单独只读入口。最近50轮先加载,历史分页与流事件按请求身份合并;切换智能体保留窗口内阅读位置,已读位置由 Main 持久保存。
- 2026-09-28 远程刷新与界面改动合并:顶栏手动刷新只读共享下发目录和配置,更新联系人资料,不重建聊天、不切换选中智能体、不清空历史或草稿;已接受问题保留原版本,下一轮由 Main 固定当前发布版本。停用后保留原聊天但禁止发送。发布介绍在顶栏悬停/聚焦显示,点击当前入口或 Escape 收起咨询栏,边缘调宽保留;不再显示重复面板标题栏或下发智能体新话题入口。追加问题使用三色卡片。
- 未发送文字草稿按账号/智能体保存;明确引用仍携带项目/Pi 来源,来源切换后须移除旧引用或恢复原上下文才能发送。只导入已登记项目中能证明当前账号与 config_id 归属的旧话题,以项目/话题/请求来源身份去重,原文件保留;重复正文不去重,失联目录稍后重试。无法证明归属的朋友/旧老师历史及旧草稿只读保留,不猜测身份。移除项目不删除账号级聊天;现有云端 coding-teacher 名称不构成角色分类。
- 输入预算在编译时计入完整执行请求。本地旧模型路径按约 2 UTF-8 字节估算 1 Token,工具定义、调用和读取预留纳入同一计量;估算不替代模型上限或实际 usage。云端以完整 JSON 转义后的 query 字节数裁剪来源节选,原文仍可按 ID 读取。固定配置/当前讨论超限与用户问题/引用超限分别提示,不静默修改发布预算、问题、明确引用或话题版本。
- 咨询回答以 Markdown 渲染标题、列表、表格、代码、HTTP(S) 链接/图片和公式,代码与表格在栏内滚动;普通 JSON、Markdown 链接与代码中的字面转义保持原义。discussion-v1 仅由顶层 reply/quickReplies/tool 或专用围栏识别,组件仍遵循既有生命周期。解析失败保留原讨论卡与可恢复正文,完整 unparsedResponse 单独持久保存并默认折叠,不再次注入后续会话上下文。
- 工具活动使用实际主线程事件及 Main 本地读取结果的名称/状态,按 run/call 关联与去重,单独折叠展示;参数、输出、错误原文与推理不进入活动 DTO 或回答。未观察到结果的调用明确显示结果缺失,不补写过期事件或旧话题。Yuxi chat_service 保证只有 AI 角色进入回答流,客户端不按内容外形猜测清洗。
## Evidence And Release Boundary
- 2026-09-28 单会话源 `7aa81da616449dead25557476cf4f1433edf84b5` 已纳入本地 main。源365项相关单测、Renderer typecheck、变更文件 lint、Vite构建和真实 Electron 夹具交互通过;扩展 Main 检查与基线同为66项既有诊断。合并保持产品/测试与源一致,不重跑相同验证。未推送、打包、部署或进行真实付费模型验收;主动观察组合验收另行完成。见[源任务](../30-worklog/tasks/20260928-agent-single-chat-27da516b.md)及[集成记录](../30-worklog/tasks/20260928-merge-agent-single-chat-9911c6df.md)。下方旧话题交互证据仅记录当时版本。
- 2026-09-24 用户明确要求多智能体在顶栏铺开并授权合并,客户端源 `a10cf000157a1a3edcfad43705e0824f19568a33` 已快进纳入本地 `main`。源相关单测、17 项浏览器布局和 1 项 Electron 夹具交互、类型/lint/构建通过,具体分批验证见[源记录](../30-worklog/tasks/20260924-consultation-topbar-22717e99.md)。合并未改变已测产品字节;不代表已更新安装版或真实供应商验收。
- 2026-09-24 渲染源 `97837cef90baf6bb02cfda0cef7b938081f3c5f7` 与 Yuxi 配套源 `02f27f33a8b816589036503f0720d446418c28aa` 已纳入本地主分支集成。客户端源 287 项单测、12 项真实浏览器布局用例及独立审查通过;Yuxi 82 项相关协议回归与真实 LangGraph 确定性模型测试通过。浏览器接口为替身,不代表安装版或线上模型已验收;旧版已覆盖的失败原文无法恢复。
- 2026-09-24 客户端源 `8a157be4f62d073744164318e02185aebeaadc09` 包含预算修复 `de72b1cd945df373d09402a1cf3a0e9b34832f03`。预算修复通过 289 项相关测试;统一智能体覆盖 323 项相关用例、类型/lint/生产构建、2 项 Electron 交互和 13 项布局测试。扩展 Main 类型检查仍有基线 66 项诊断,无新增;不代表真实收费模型、已安装客户端或生产整链验收。详见两份源任务记录。
- 配套源:Works Square 79b1da574364d6f412e4395c179b5d27cc7bbd7d;Yuxi c2792dc4938a68db8ce1e34056e84af4b06c739b;MakeLore d20c818fe79bc5833cef15d99974b699dde71c6d。
- 源验证包括 WS 66 passed / 1 skipped、Operations 125 项及构建/浏览器验证;Yuxi 2243 passed / 1 skipped、真实 HTTP/PostgreSQL/Redis/worker/SDK 续接验证;MakeLore 51 项相关测试、typecheck、lint、构建及已有 Electron 流程验证。模型使用明确替身,真实供应商扣款与完整生产拓扑未验收。
- 合并不代表部署;需配套发布三个端及 Yuxi worker。本次无新增数据库迁移,WS 唯一 head 仍为 20260922_0096。老师模型必须在学生网关开放,既有云接入配置与被选资源依赖须就绪。
- 本修订取代旧 Main 独立模型循环、云端不存老师消息、纯文本 Skill、客户端不能选老师等边界。历史实施与验证保留在源任务记录;当前机制见 [产品说明](../../README.md)。