docs: integrate Learning removal

This commit is contained in:
inman
2026-09-04 12:15:32 +08:00
parent bd0873f348
commit 5f87a42d59
11 changed files with 174 additions and 58 deletions

View File

@@ -11,12 +11,10 @@
- 上传协议必须同时携带源码归档、构建归档和严格版本化 artifact contract服务端独立重算摘要、校验合同并固化不可变 Release。
- Renderer 不得获得发布凭据、归档、临时目录、构建 origin 或任意本地路径;旧客户端和旧 sandbox/browser 任务必须提示升级后重新构建提交。
- Works Project 首次 create 必须用单一 multipart 合同原子提交文字资料与必选的 PNG/JPEG/WebP 封面;创建失败或冲突不得继续上传版本。已有项目保持 version-only在没有 metadata revision/条件写前,客户端不得通过无条件 PATCH 修改已有资料。
- Learning 必须保持登录和 `module_access.learning` 门禁并只呈现服务端已发布的分页项目列表、README 详情和下载动作旧课程生成、进度、本地库、播放器、Agent/ASR/runtime 代码和打包依赖不得继续存在
- Learning README 必须禁用原始 HTML远程 HTTPS raster 图片由 Works Square 在发布时校验、镜像并改写为固定媒体路径Main 以 Bearer 代理并限制可信 MIME 和 10 MiBRenderer 不获得任意网络代理能力。
- Learning 项目下载必须由 Main 打开原生保存窗口并写入临时文件,不按 `Content-Length``archiveBytes`、实际流字节数或客户端上限阻断;最多五跳同源重定向,校验 SHA-256 和 ZIP 签名后再原子落盘。Renderer 只能获得 `saved``cancelled`,不得获得 Token、上游 URL 或本地路径。
- Learning 入口、路由、Renderer、Main Host API、共享 DTO、素材、打包依赖和兼容 fallback 必须保持移除;旧 Learning URL 回到模块选择页,旧 Host API 路径返回标准 not-found
- 历史课程数据不得被新逻辑读取或迁移,也不得在没有独立用户确认与恢复策略时自动删除。
- Robot Guided Hotspot Binding 必须保持固件零改动、Main-owned default-on capability、精确环境值 `0` 回滚、固定系统浏览器 Portal 和现有六位 Binding facade。Windows/macOS 页面内只能扫描开放 `Xiaozhi-*` 短效候选并连接用户明确选择的项Makelore 不得接触家庭 Wi-Fi 凭据,也不得把热点发现或 Binding 成功等同于可信身份/在线。
- 用户模块入口策略必须由 Electron Main 将 Works `/api/auth/me` 安全投影为个布尔值;缺失对象/字段默认开启,`design` 映射 `painting`Renderer 不获得 Token 或原始 profile。
- 用户模块入口策略必须由 Electron Main 将 Works `/api/auth/me` 安全投影为 Code、Canvas、Robot 三个布尔值;缺失对象/字段默认开启,`design` 映射 `painting`额外旧字段被忽略,Renderer 不获得 Token 或原始 profile。
- 被关闭模块必须在卡片和根/深层/别名路由两层均无法进入,且在 `MainLayout`/模块初始化前阻断Code provider 等待 policy hydration全局 `/settings` 仍可访问,终止性 `401` 清理 Main/Renderer 会话。该客户端入口策略不能代替 API 授权。
- Makelore Code 必须只使用精确 pin 的 Pi `0.84.2` production runtime产品源码、安装包和资源根不得保留 OpenCode runtime/package/plugin/fallback/双路径。上游 Pi Provider adapter 的精确静态文件例外必须单列,不能误报为产品旧 runtime。
- 新 project/Agent/Conversation 必须在 `.makelore` 中本地原子创建,不读取或迁移 `.niancode` / `.opencode` 项目元数据Composer 在逻辑线程准备期间仍可编辑。每条 active/warm Conversation 在单一父 Agent Server 内独立绑定 Runtime/Session/channel/credential/extension contextSnapshot/Patch、model/thinking、queue、interaction、subagent 和 recovery 不得跨 Conversation 泄漏。
@@ -29,9 +27,8 @@
- 发布安装包前运行 `pnpm verify:publish-runtime`,并对最终 Windows 产物运行 `pnpm verify:artifact:win`;固定 npm 闭包缺失或版本不符时 fail closed。
- 至少覆盖 release builder/静态产物服务/发布路由/Renderer 状态的聚焦测试、typecheck、scoped lint、Vite 构建和真实 Electron 双视口 production-seam E2E。
- 真实生产发布仍需成组验证服务端合同、不可变 Release、运营审核、CDN/App 播放;客户端本地验证不能替代该整链验收。
- Learning 上线前必须部署 Works Square 项目管理、对象存储、README HTTPS URL 校验和 list/detail/media/archive API并使用真实账号和正式安装包验证发布/下架、分页、README 图片、下载取消、缺失或错误 `Content-Length`、损坏/摘要不匹配 ZIP以及 Windows 与签名 macOS 保存行为。
- Robot 默认引导路径必须通过聚焦 Renderer/Main/native 测试并保留 `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` 回滚。真实 Host API/native seam Electron E2E、Windows Robot 真机、签名 macOS x64/arm64、指定固件镜像与六位码发行契约未完成前不得宣称完整双平台硬件兼容或端到端配网已经验收。
- 模块入口策略发布前必须部署 Works migration/API、重新打包客户端并以真实账号对 Code、Canvas、Learning、Robot 分别执行关闭 smoke客户端自动化不得代替服务端 API 授权验收。
- 模块入口策略发布前必须部署 Works migration/API、重新打包客户端并以真实账号对 Code、Canvas、Robot 分别执行关闭 smoke客户端自动化不得代替服务端 API 授权验收。
- Windows 最终安装包必须通过 Pi production closure、最终 `app.asar` Main、真实 extension/ephemeral child、单一父 Agent Server 内 4 条重叠 Conversation 逻辑线程 + 4 个 child live-PID、单线程关闭、Server 崩溃重启、prompt/compact uncertainty、late-settle 和零残留进程验证。loopback/provider-shaped smoke 只能证明协议序列化与本地隔离,`realTurnVerified=false` 时不得宣称真实 Provider Pass。
- macOS x64/arm64 与 native non-WSL Linux desktop/compositor 的最终安装产物仍是 cross-platform release gateWindows 或 WSL2/WSLg 通过不能替代这些平台证据。

View File

@@ -2,7 +2,12 @@
## Status
Accepted and implemented on 2026-08-20.
Superseded on 2026-09-04 by the explicit product decision to remove Learning
from Makelore. Source `5a7cb9b` was integrated as `bd0873f` by task
`20260904-integrate-remove-learning-6e4a9c21`.
This ADR remains only as historical context. Its catalog, route, API, download,
packaging, and release obligations are no longer active.
## Context
@@ -26,6 +31,16 @@ The integrated Learning module previously implemented course generation, an acco
- Removing client download-size checks avoids rejecting otherwise valid streams with missing or inaccurate size metadata, but also removes client-side protection against an archive consuming excessive disk space. Works Square may retain an independent operations upload/storage limit.
- A future historical-data cleanup must be an explicit, user-controlled maintenance feature.
## Superseded Consequences
- Makelore now exposes only Code, Canvas, and Robot as top-level modules.
- Learning Renderer, Main, shared DTO, asset, test, and server-contract sources are removed.
- Old Learning routes fall through to the module chooser and old Learning Host API paths
return the normal not-found response; no compatibility implementation is retained.
- Historical downloaded course data remains untouched and is not read or migrated.
- The literal `makelore-learning:v1` remains frozen only as a cross-module persisted
account-partition compatibility salt; its name does not represent an active module.
## Supersedes
- The Learning course-generation, local-course, OpenMAIC playback, and classroom-runtime behavior introduced by integrated source `01bee31`.
@@ -43,7 +58,6 @@ The integrated Learning module previously implemented course generation, an acco
## Related
- `docs/learning-project-catalog-server-contract.md`
- `.project-docs/20-architecture/system-overview.md`
- `.project-docs/20-architecture/data-flow.md`
- `.project-docs/40-domain/business-rules.md`

View File

@@ -8,7 +8,6 @@
| ADR-002 | Robot V1 采用 Main 门控的引导式热点配网并衔接现有六位 Binding | Accepted / implemented, default on | 2026-08-16 | Robot Renderer、Host API、Electron Main、现有固件热点入口 | `adr-002-robot-guided-hotspot-binding-v1.md` |
| ADR-003 | Robot 配网页内扫描并连接 Windows/macOS 热点 | Accepted / implemented with physical release gates pending | 2026-08-16 | Robot Renderer、Host API、Electron Main、Windows WLAN、macOS CoreWLAN/CoreLocation | `adr-003-robot-in-app-hotspot-connection.md` |
| ADR-004 | Works Square 统一拥有桌面认证生命周期边界 | Accepted / implemented | 2026-08-19 | Renderer、Host API、Electron Main、Works Square auth facade | `adr-004-square-auth-lifecycle-boundary.md` |
| ADR-005 | Learning 采用运营精选项目目录、直接渲染经校验的 HTTPS README 图片、下载不做大小校验并退役课程运行时 | Accepted / implemented, amended 2026-08-20 | 2026-08-20 | Learning Renderer、Host API、Electron Main、Works Square operations/API | `adr-005-learning-project-catalog.md` |
| ADR-006 | Makelore Code 以 Pi `0.84.2` 为唯一 runtime父 Conversation 复用一个 Main-owned Agent Server 并隔离逻辑 Runtime/Session/provider/lease产品只暴露 Snapshot/Patch 合同 | Accepted / implemented, amended 2026-08-31 | 2026-08-26 | Code Renderer、Host API、Electron Main、Pi runtime、Provider/resource、packaging | `adr-006-pi-runtime-hard-cutover.md` |
## Superseded Decisions
@@ -16,6 +15,7 @@
| ID | Decision | Superseded By | Date |
|---|---|---|---|
| ADR-001 | AI 绘画 Workspace / Conversation 状态归属 | ADR-007 | 2026-08-30 |
| ADR-005 | Learning 运营精选项目目录与下载边界 | 2026-09-04 用户产品决定:从 Makelore 移除 Learning`5a7cb9b`,集成 `bd0873f` | 2026-09-04 |
## Decision Criteria

View File

@@ -12,7 +12,7 @@
| Effective Plugin worker snapshot | Installed trusted package or acquired official bundled definition + project selection + Agent assignments + current server policy | effective resolver → Registry/resource loader/Extension Host/tool catalog → parent Pi worker | One frozen snapshot supplies Skills, tools, package roots, and runtime authorization. Disable, account/project switch, logout, Renderer crash, Main shutdown, or worker generation change invalidates future actions without mutating persisted unknown assignments; child workers receive no Plugin projection. |
| Hosted Game Resource operation | Eligible parent `makelore.game-resource` tool call plus explicit confirmation | frozen Plugin adapter → capability Registry → Main `GameResourceClient` → fixed Works Square game-resource route → provider-neutral receipt/result | Server policy owns pricing, payer, Admission and receipt state. Stable logical operation identity survives response loss/Main restart; `submission_unknown` is not replayed as a fresh request. Result saving uses a bounded project-relative path and the existing project write lease. |
| 桌面认证生命周期 | Renderer 登录、刷新与注销请求 | Host API → Main Works Session → Works Square `/api/auth/{login,mobile-login,refresh,logout}` → one-feel auth | Main 加密持有并先持久化轮换 token客户端不携带 OAuth client secret连续 7 天未使用才清除会话,终止性 `400`/`401` fail closed |
| 用户模块入口策略 | 会话恢复 / 登录 / 刷新 | Electron Main → Works `/api/auth/me`布尔安全投影 → Renderer auth store → 卡片/路由/provider gate | 缺失对象或字段默认 `true``design` 映射 `painting`;终止性 `401` 清理 Main/Renderer 会话;全局 `/settings` 不受 Code gate |
| 用户模块入口策略 | 会话恢复 / 登录 / 刷新 | Electron Main → Works `/api/auth/me`布尔安全投影 → Renderer auth store → 卡片/路由/provider gate | 缺失对象或字段默认 `true``design` 映射 `painting`额外旧字段被忽略;终止性 `401` 清理 Main/Renderer 会话;全局 `/settings` 不受 Code gate |
| 项目创建 | 新建项目对话框 | Host API → Main 项目初始化 | 创建时固定 `ProjectType`;小游戏/小程序原子生成受控模板,自定义只生成项目空间 |
| 一键提交 | `ProjectPublishAction` | Renderer capability → Host API → Main 本地 npm/Vite build → built snapshot preflight → source+built+contract 上传 | 只对小游戏/小程序开放;首次 create 通过单一 multipart 合同原子提交文字资料与必选 PNG/JPEG/WebP 封面,创建失败或冲突不上传版本;已有 draft/published 只提交版本并沿用云端资料/封面,不做无条件 metadata PATCH |
| 构建产物预检 | Main-owned built snapshot | 一次性 loopback origin → fresh Electron WebContents/CDP桌面、移动 | 检查错误、白屏和外域;不调用 Playwright检查与上传归档相同字节但不产生可信 receipt |
@@ -35,8 +35,6 @@
| Design Task and Asset sync | Direction event stream / Workspace resource events / explicit refresh | Renderer Task/Asset projections | Task/Asset events独立于 Living Formtransport order 和 progress 不改写 Specification也不授权新生成操作 |
| 设计项目删除 | Canvas 侧栏精确项目名确认 | Renderer → Main Host API → Works Square Workspace DELETE | 删除成功后清理当前 Workspace/Direction/resources 并选择最近更新的剩余项目;结算与软删除语义由服务端负责 |
| Prompt Museum 浏览与使用 | Canvas 侧栏“获取灵感” | Renderer → Main Host API → Works Square list/detail选中 Prompt → 进程内 pending state → 当前 Canvas 输入框 | 只发送白名单筛选/游标Works Token 留在 MainPrompt 不自动发送Museum 不包含客户端静态数据集 |
| Learning 项目浏览 | Learning 项目列表 / README 详情 | Renderer → typed Host API → Main fixed list/detail routes → Works Square published projectsREADME 图片节点 → 远程 HTTPS origin | 保留登录与 `module_access.learning`Main 严格投影分页项目 DTOREADME 禁用原始 HTML仅图片节点可直连无凭据 HTTPS URL封面和历史媒体仍使用受控媒体读取 |
| Learning 项目下载 | README 详情页“下载项目” | Renderer → Host API → Main 原生保存对话框 → Works archive stream → 临时文件 → 原子重命名 | 不校验 `Content-Length``archiveBytes`、实际流字节数或客户端大小上限;最多五跳同 Works origin 重定向且不向重定向请求携带 BearerSHA-256 与 ZIP 签名匹配后才保存Renderer 只得到 `saved``cancelled` |
| Robot 引导式热点配网 V1已实现、默认开启 | Robot Binding 页面 | 用户选择引导配网 → 进入固件配网模式 → Renderer 经 Host API 请求 Main 扫描 → 用户选择短效候选 → Windows/macOS Adapter 连接并核验当前 SSID → Main 打开固定 Portal → 用户在 Portal 配置 Wi-Fi → 电脑恢复互联网 → 现有六位 Binding | 精确环境值 `0` 或 capability 读取失败回退直接六位码;系统 Wi-Fi 保留兜底Makelore 不收集 Wi-Fi 密码、不修改固件,热点发现/`bound` 都不等于可信身份或 online/ready |
## State Ownership
@@ -44,13 +42,14 @@
- Main 持有刷新凭据、发布 Token、固定 npm runtime、源码/构建归档、临时目录、幂等键和 submission binding v2Renderer 不持有归档路径、构建 origin 或自动部署状态。
- 项目内 `.makelore/project.json``ProjectType`、Agent 与 Coding 项目配置的唯一权威Main 在配置写入和目录复用时保持 `ProjectType` 不可变,并在打包时重新读取校验。
- Renderer 仅持有短效公开会话状态和提交展示状态。
- Renderer 可持久化当前账号的布尔模块入口策略,但不持有原始 Works profile 或 Token。新账号不继承上一账号缓存网络/暂时上游失败可保留同会话已知策略,终止性 `401` 不得回退到默认开启。
- Renderer 可持久化当前账号的布尔模块入口策略,但不持有原始 Works profile 或 Token。新账号不继承上一账号缓存网络/暂时上游失败可保留同会话已知策略,终止性 `401` 不得回退到默认开启。
- 本地构建临时目录、HTTP origin 和预检 WebContents/partition 只属于一次调用;预检读取与 `built_archive` 相同的内存字节,但结果不写为可信上传 receipt也不覆盖生产 opaque-origin。
- 旧 schema v1 `submitted` 记录迁移并保留;旧 `armed``waiting_for_package``waiting_for_login``uploading``failed` 归一为 `legacy_retired`,不再启动 watcher 或上传任务。
- AI Design Current Specification 与 current Direction 是语义权威conversation timeline 只保存交互历史immutable Quote 绑定精确 Specification revisionTask/Asset 属于 Workspace resource projection。
- AI 绘画 Main 持有 Workspace 请求 deadline、底层 transport fallback 和共享 Works token refresh flight。共同等待者必须在同一有限期限内 settlerefresh flight 结束后必须释放,后续刷新可重新发起;底层 mutation transport failure 不得自动产生第二次上游请求。
- Prompt Museum pending Prompt 是 Renderer 进程内一次性导航状态Canvas 消费后立即清除,不进入 Workspace/Specification直到用户主动提交 Design input。
- Learning 不再维护客户端课程库、生成任务、player registration、进度或 runtime 状态。Main 在一次下载调用内持有当前账号快照、Works 凭据、保存路径和临时文件;账号变化或校验失败会中止并清理临时文件。历史课程数据不会被新逻辑读取,也不会自动删除。
- Retired Learning data is outside the active client state model. Historical downloaded
course data is not read, migrated, or automatically deleted.
- 图生图参考图与视频首帧都先归一为当前 Workspace Asset再通过 typed binding 写入 Specification本地路径不会进入 canonical contract。
- Development 与 packaged Canvas 都使用 Main-owned Works Square V2 adapter。V1 DTO/local semantic adapter 与 local/cloud mode switches 已删除,不存在失败回退。
- 注销和退出关闭本地 event stream、清除 drafts/pending state 和凭据;服务端 current Direction Session 与 semantic history 保持持久化。
@@ -68,14 +67,13 @@
## External Interfaces
- Works Square 项目创建、版本上传、构建状态与 Release 状态 API。
- Works Square `/api/auth/me` 模块权限 APIElectron Main 持有 Bearer 并只向 Renderer 投影 `programming`/`design`/`learning`/`robot` 对应的个布尔值。
- Works Square `/api/auth/me` 模块权限 APIElectron Main 持有 Bearer 并只向 Renderer 投影 `programming`/`design`/`robot` 对应的个布尔值,额外旧字段被忽略
- 本机 Host API 的发布路由;发布路由要求 Renderer capability。
- 本机 `/api/coding/*` project/Agent/Conversation、Snapshot/patch-batch SSE、prompt/compact/fork/recover、attachment/file/interaction/diagnostics 路由,以及 Main-owned AI 模型代理。
- Main-owned electron-updater IPC 与 Works Square 平台/架构稳定 feed正式安装产物发布不由 Renderer 控制。
- 服务端安全投影后的公共 `play_url`;只接受同源 HTTPS、精确 App 路径和可信版本状态。
- Works Square Design V2 Workspace/Direction/Living Form API、持久 Agent Gateway Session、Direction event stream以及 `design.input.apply``design.quote.request``design.generation.confirm` stable-operation contract。
- Works Square Prompt Museum list/detail APIMain 添加当前账号 Bearer TokenRenderer 只使用 Host API 投影。
- Works Square Learning project list/detail/media/archive APIMain 添加当前账号 Bearer Token并限制固定路径、DTO、封面/历史媒体 MIME/大小、归档重定向、摘要和 ZIP 签名归档大小字段只作展示不参与下载门禁。README 中经服务端校验的无凭据 HTTPS 图片由 Renderer 图片节点直接请求。
- 已实现的本机 Robot provisioning capability、固定 portal-open 与 hotspot scan/connect Host API。它们是本地 Main 操作,不读取 Works access token、不调用上游也不接受任意 URL/SSID/BSSID/interface/profile。
## Last Updated

View File

@@ -42,9 +42,6 @@
| `shared/image-prompt-museum.ts` | Prompt Museum 列表、分类、详情、署名与分页共享 DTO | 客户端不包含内容数据集,只定义服务端字段契约 |
| `electron/api/routes/image-prompt-museum.ts` | Main-owned Museum 列表/详情代理与 Works 登录态 | 仅 GET 固定路径和白名单查询Renderer 不获得 Bearer Token |
| `src/pages/ImagePromptMuseum/index.tsx` / `src/lib/image-prompt-museum.ts` / `src/stores/image-prompt-museum.ts` | Museum 搜索/筛选/详情与一次性 Prompt 回填 | 原 Prompt 只带回 Canvas 输入框,不自动发送;页面不接受投稿或互动 |
| `shared/learning.ts` / `src/lib/learning.ts` | Learning 项目列表、详情、媒体和下载结果的共享 DTO/Renderer facade | 项目 API 访问走固定 Host APIRenderer 不持有 Token、任意归档 URL 或本地路径README 仅接受无凭据 HTTPS 图片 URL |
| `electron/api/routes/learning.ts` / `electron/services/learning-project-download.ts` | Main-owned Learning 项目代理、封面/历史媒体读取和原生 ZIP 保存 | 固定 Works 路径、严格 DTO 与媒体 MIME/大小边界、最多五跳同源重定向、SHA-256/ZIP 签名校验和原子重命名;归档不做大小校验 |
| `src/pages/Learning/` / `src/components/layout/LearningSidebar.tsx` | 分页项目卡片、README 详情和下载入口 | 保留登录与 `module_access.learning`README 禁用原始 HTML仅图片节点直连无凭据 HTTPS URL旧生成/播放器入口不存在 |
| `src/pages/AiHardware/index.tsx` | Robot 管理、现有六位 Binding以及已实现的 default-on 引导式热点配网状态机 | 只编排非敏感步骤;不接收 Wi-Fi 密码,不把 `bound` 展示为在线证明 |
| `src/lib/ai-hardware.ts` | Renderer 侧 Robot Host API 类型、安全错误映射和稳定 Binding/hotspot facade | 读取 Main-owned capability调用固定 portal-open并只传递短效 hotspot candidate ID不添加任意 URL、SSID 或 Renderer IPC |
| `electron/api/routes/ai-hardware.ts` | Main-owned Robot 云端代理,以及本地 capability/portal/hotspot actions | 默认开启、精确环境值 `0` 回滚;所有本地操作必须在 Works token/上游访问前返回,且只投影稳定安全错误 |
@@ -63,7 +60,6 @@
- Built artifact preflight 检查最终上传的同字节快照,但客户端可被绕过且不产生可信 receipt服务端仍是合同、摘要和不可变 Release 安全权威。
- Robot Renderer → typed AI hardware API → Main Host route → Robot Hotspot Module → Windows/macOS Adapter。云端 Binding 仍由 Main 代理;热点选择/连接移入页面,但家庭 Wi-Fi 凭据输入仍只留在固件 Portal系统 Wi-Fi 保留为兜底。
- Prompt Museum Renderer → typed Host API facade → Main fixed list/detail route → Works Square。Museum 只把用户明确选择的 Prompt 原文暂存到进程内 Store 并导航回当前 Canvas不会直接触发 Agent 命令或生成任务。
- Learning Renderer → typed Host API → Main fixed project routes → Works Square list/detail/media/archive。Main 代理受控图片并持有原生保存与归档校验Renderer 只获得安全 DTO、图片数据和保存结果。
## Risky Or Sensitive Areas
@@ -83,7 +79,6 @@
- Design V2 事件处理必须区分 Direction projection 与 Workspace Task/Asset projection不得用 transport sequence 或 Task progress 推进 Specification revision。
- 输入、Quote request、confirmation 和项目切换跨 Renderer/Main/Works Square。异步结果必须核对 Workspace、Direction、revision 与 operation identityunknown write 复用原 identity不能生成新业务意图。
- Prompt Museum 图片和来源 URL 来自服务端数据。服务端必须完成内容授权/署名审核;若未来需要凭据化素材,应新增 Main-owned 媒体代理,不能把对象存储凭据放进 Renderer URL。
- Learning 的远端 JSON、Markdown、媒体、错误和 ZIP 下载跨信任边界;必须保持严格 DTO、固定项目/封面/历史媒体路径、可信 raster MIME、媒体/README 大小、同源重定向、SHA-256、ZIP 签名、一次 401 refresh 和固定安全错误。ZIP 下载明确不校验 `Content-Length``archiveBytes`、实际流字节数或客户端大小上限。README 仅允许图片节点直连经服务端校验的无凭据 HTTPS URL不能扩展为任意 Works 下载或文件系统代理。
- Design command replay requires the original stable command and semantic operation IDs; business rejection never authorizes a retry with a fresh identity. Resource reconciliation cannot overwrite the Living Form.
- Canvas cleanup only closes the local stream/buffers. The server-owned Direction Session and semantic history remain durable.
- Image/video references use typed Asset binding and Specification medium; display text is never an action protocol.

View File

@@ -13,7 +13,7 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
| Project Configuration & Template | 保存不可变 `ProjectType`,原子生成新项目骨架 | 小游戏/小程序生成受控 Vite 模板;自定义保持最小项目空间 |
| Project Release Builder | Main-owned 安全快照、本地 npm/Vite 构建、双归档与 artifact contract | 固定 npm 11.6.2Vite 由项目 lockfile 锁定;产物与预检使用同一内存字节 |
| Works Session & Remembered Password | Main-owned 登录、刷新、注销、七天真实活动滑动续期与可选密码回填 | 登录、刷新、注销统一经过 Works Square轮换凭据由 Main 安全持有和持久化。记住密码使用独立的 packaged-only OS 加密记录,不进入 Renderer 持久状态或 Works Square客户端不携带 OAuth client secret |
| Module Access Policy | Main-owned `/api/auth/me` projection → Renderer auth state → module chooser/router | Renderer 只接收 Code/Canvas/Learning/Robot 个布尔值;缺失对象或字段默认开启,服务端 `design` 映射客户端 `painting` |
| Module Access Policy | Main-owned `/api/auth/me` projection → Renderer auth state → module chooser/router | Renderer 只接收 Code/Canvas/Robot 个布尔值;缺失对象或字段默认开启,服务端 `design` 映射客户端 `painting`,额外旧字段被忽略 |
| Submission Binding | 保存云端已接受的精确 app/version/review/hash 绑定 | schema v2 只记录成功提交;旧中间态迁移为 `legacy_retired`,不恢复后台任务 |
| Play URL Projection | 校验服务端公共播放地址 | 只接受同源 HTTPS 和精确 `/apps/{app_id}/`;优先 `play_url``runtime_url` 仅一版本回退 |
| Built Artifact Preflight | 在上传前对最终 built snapshot 做桌面/移动 UX fail-fast | Main 使用临时 loopback origin 与 Electron WebContents/CDP不使用 Playwright、不生成可信证明 |
@@ -31,9 +31,6 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
| AI Design Quote & Task Controls | 精确 Specification revision 编译出的不可变 Quote 与 Workspace Tasks | 客户端只展示 public output summary、warnings、expiry 与 Token Points并以 Quote ID 确认Provider Prompt/model/route/storage/billing atoms 不下发 |
| AI Design Assets | Workspace 已完成作品或本地上传的真实 Asset | Asset 通过 typed binding 写入 Specification生成结果经 Main-owned asset download 保存 |
| Prompt Museum | Canvas “获取灵感”页面 → Main Host API → Works Square | 服务端驱动的审核内容、筛选和分页Renderer 不持有 Works Token 或内置数据集,“使用此 Prompt”只回填输入框 |
| Learning Project Catalog | 服务端分页项目卡片、README 详情与用户选择的 ZIP 下载 | Renderer 只持有安全项目 DTO 和 Markdown不提供生成、进度、本地课程库或播放器 |
| Learning Main Boundary | 固定 Host API → Works Square project list/detail/media/archive | Main 持有 Works Bearer、封面/历史媒体代理、原生保存路径、受控重定向、临时文件、SHA-256/ZIP 签名校验与原子落盘归档下载不执行大小校验README 图片节点可直接加载无凭据 HTTPS URLRenderer 不获得任意归档 URL 或本地路径 |
| Robot Workspace | Account-scoped agent configuration, device activation/binding, assignment, and credential-recovery UI | Renderer receives only safe Works Square projections. Configuration choices come from the USER-scoped safe catalog; unavailable current values remain editable without exposing provider credentials or configuration internals. |
| AI Hardware Main Route | Fixed `/api/works/ai-hardware` Host API to Works Square proxy | Main owns Bearer auth, stable operation IDs, bounded retry, ETag/If-Match, request/response limits, error redaction, and the fixed no-store configuration-catalog proxy. Versioned responses accept only canonical strong or weak numeric ETags that equal the DTO revision; mutations always emit strong `If-Match`. It never forwards Renderer authorization headers. |
| Robot Hotspot Module | Main-owned bounded scan/connect/verify interface with Windows WLAN and macOS CoreWLAN/CoreLocation adapters | Accepts only short-lived opaque candidates from the latest scan, exposes no BSSID/interface/profile/native diagnostic, and retains the system-Wi-Fi fallback. |
@@ -43,13 +40,15 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
- Renderer 只能通过 Main Host API 发起认证操作。Electron Main 是 access/refresh token 的唯一客户端所有者;登录、刷新、注销统一经过 Works Square 固定路由,客户端不得直连 one-feel/custom 身份服务,也不得保存 confidential OAuth client secret。
- 可选的记住密码记录属于 Electron Main 的独立本机边界,只能在正式安装包且 OS 凭据加密可用时落盘Renderer 不得持久化账号密码Works Square 不得接收记住标志或新增密码持久化。
- Code、Canvas、Learning 与 Robot 是个已启用顶层产品模块Robot 仍是唯一硬件产品模块,不存在单独 Hardware 卡片。
- 每个登录用户可由 Works `module_access` 关闭任意顶层模块入口。Main 只投影个布尔值;被关闭卡片置灰不可点,根/深层/别名路由在 `MainLayout` 和模块初始化前拦截。Code provider 必须等待 auth policy hydration而全局 `/settings` 不属于 Code policy guard。
- Code、Canvas 与 Robot 是个已启用顶层产品模块Robot 仍是唯一硬件产品模块,不存在单独 Hardware 卡片。
- 每个登录用户可由 Works `module_access` 关闭任意顶层模块入口。Main 只投影个布尔值;被关闭卡片置灰不可点,根/深层/别名路由在 `MainLayout` 和模块初始化前拦截。Code provider 必须等待 auth policy hydration而全局 `/settings` 不属于 Code policy guard。
- 模块入口策略是用户交互与客户端初始化边界,不是服务端 API 授权。终止性 `/api/auth/me` `401` 必须清理 Main 和 Renderer 会话;各模块 API 仍须独立强制认证与授权。
- Product UI language is Chinese-only. Unsupported system or persisted language values normalize to `zh`; removed locale files are not runtime fallbacks.
- Canvas is cloud-only in development and packaged builds. The removed local Workspace adapter and V1 DTOs are not fallback paths.
- Prompt Museum is a read-only curated inspiration surface, not a user-content community. Main owns Works authentication and forwards only the bounded list/detail routes; the client never bundles museum content or automatically submits a selected Prompt.
- Learning uses a Main-owned read-only project-catalog boundary. Renderer does not receive Works credentials, object-storage identifiers, arbitrary archive URLs, temporary/final paths, or an arbitrary network proxy. README raw HTML is disabled; Markdown image nodes alone may load validated credential-free HTTPS URLs directly, including SVG and other formats Electron supports. Main continues to validate covers/historical media and streams a selected project ZIP through bounded same-origin redirects, SHA-256, ZIP signature, and atomic rename before returning only `saved` or `cancelled`; it ignores archive size metadata and applies no client download-size ceiling.
- Learning is retired. No Learning route, Renderer surface, Main Host API, download service,
shared DTO, packaging asset, or fallback remains. Historical downloaded course data is
not read, migrated, or automatically deleted.
- AI hardware network access is Main-owned. Renderer cannot hold Works Square or Xiaozhi credentials and cannot select arbitrary upstream paths or headers.
- Robot model, language, and voice choices are dynamically projected from the Xiaozhi USER catalog through Works Square and Electron Main; the catalog is bounded, account-scoped, and `private, no-store` at each public hop.
- One local account maps to one server-side Xiaozhi account binding. Agents and devices are resources beneath that account binding, not separate Xiaozhi users.
@@ -97,7 +96,7 @@ Makelore 是 Electron 桌面客户端。Renderer 负责项目操作与状态展
## Related Decisions
- 当前长期边界记录于 README、ADR-002 至 ADR-007ADR-001 已由 ADR-007 supersede及各 Integration Gate后续如改变唯一入口、凭据所有权、构建执行边界、Living Form/Specification 状态归属、Pi 单 runtime/worker/lease 边界、Learning/Marketplace/Web Search 分发边界、Robot 配网边界或重新引入客户端部署协调器,应新增 ADR。
- 当前长期边界记录于 README、ADR-002 至 ADR-007ADR-001 ADR-005 已 supersede及各 Integration Gate后续如改变唯一入口、凭据所有权、构建执行边界、Living Form/Specification 状态归属、Pi 单 runtime/worker/lease 边界、Marketplace/Web Search 分发边界、Robot 配网边界、重新引入 Learning 或重新引入客户端部署协调器,应新增 ADR。
## Last Updated

View File

@@ -4,6 +4,22 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
## Integrated Through
- Learning-removal source `5a7cb9b2085848631bdf7de45fe1cac74b905ed9` from task
`20260903-remove-learning-7a91` is integrated onto the latest local `main` as
`bd0873f34823754760368d8d37703c74bf65106d` by task
`20260904-integrate-remove-learning-6e4a9c21`, preserving the later AI Design
and unified Plugin workspace changes. Makelore now exposes only Code, Canvas,
and Robot; the Learning route tree, Renderer, Main Host API, download service,
shared DTOs, artwork, tests, server contract, and packaging surface are removed.
Stale Learning URLs return to the module chooser and retired Host API paths use
the standard not-found boundary. Historical course data remains untouched and
unread, while `makelore-learning:v1` stays byte-for-byte frozen only as a shared
account-partition compatibility salt. ADR-005 and the Learning deployment
commitment are superseded by the user's explicit 2026-09-04 product decision.
Integration verification passed dependency lock install, 8 focused files / 109
tests, typecheck, full unit 1,844 with 3 skips plus pressure 1/1, production build,
targeted Electron 8/8, and full Electron 33/33 with 1 platform skip. Lint reported
0 errors and only existing warnings in current source and a historical worktree.
- Conversation-first AI Design client source
`fe50e4ba198649a07c5c9443f15edf7dfa2a47e6` from task
`20260903-design-guided-conversation-client-8b4e1c72` is integrated onto local
@@ -87,8 +103,9 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
local and remote mainline histories with normal merge `d25ed08`: fetched
`origin/main` frontier `28e1690` and local frontier `301c149` are both ancestors
of the integrated tree. It also reviewed every local worktree/branch; historical
Learning Player source `b1f51be` remains intentionally excluded under ADR-005,
rather than being mistaken for current product work. No history rewrite or
Learning Player source `b1f51be` remains intentionally excluded and the later
complete Learning removal supersedes ADR-005, rather than that source being
mistaken for current product work. No history rewrite or
force-push is part of this integration.
- Packaged Pi runtime-root source `5d7a235` from task
`20260902-build-unsigned-mac-9d7e4a2c` is integrated through merge `4babd6d`.
@@ -147,8 +164,8 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
and collapsed process previews remain anchored to their first displayable
line. Those predecessor Project Configuration Plugin surfaces are superseded by
the reviewed unified `/plugins` workspace above and are not restored. Historical
source `b1f51be` remains explicitly excluded because
ADR-005 continues to retire the OpenMAIC Learning Player packaging chain.
source `b1f51be` remains explicitly excluded; the 2026-09-04 product decision
supersedes ADR-005 and removes the remaining Learning catalog surface as well.
- Youth-facing AI Design client source
`0fd32a2d49045a8f9e7f2e19ba6477f48f93e30c` is integrated over Model Tools
frontier `7552cf59526449c29d663a769c0fb62d84a1a759` through merge
@@ -479,14 +496,15 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
their existing boundaries. The matching Works Square source is `65ea070`.
- Learning project-catalog source commit `38db158` from feature task
`20260819-learning-project-catalog-impl-4e9c71a2` was merged as `d967b0f` by integration task
`20260820-integrate-learning-catalog-a73e91c4`. Learning keeps its login and
`20260820-integrate-learning-catalog-a73e91c4`. At that historical checkpoint Learning kept its login and
`module_access.learning` gate but now contains only a server-driven project list,
safe README detail, direct credential-free HTTPS Markdown images, and a Main-owned verified
native ZIP save path. Course generation, progress, local library, OpenMAIC player,
Agent/ASR/classroom runtime, Learning IPC and player-artifact packaging were removed
without a compatibility read path. Historical course data is left untouched. The
matching Works Square operations/admin/API implementation and real-account package
smoke remain pending.
smoke remained pending. The 2026-09-04 removal recorded at the top of this file
supersedes that catalog and its deployment obligation.
- Square-auth lifecycle source commit `dc776ff` from feature task
`20260819-square-auth-proxy-client-8c4f2a` was merged as `f52c2c8` and promoted
from verified candidate `e7ec12d` to local `main` by integration task
@@ -521,7 +539,7 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
- Project-cover source commit `145a6ce571d646325092d1e722282babea503954` from feature task `20260817-project-cover-upload-a6a98e56`, integrated by task `20260813-sync-push-main-9c2f71`. First submission now requires a bounded PNG/JPEG/WebP cover, shows preview/file/reselect feedback, and sends metadata plus cover through Main-owned `POST /api/projects/with-cover`; conflicts stop before version upload and existing draft/published projects remain version-only. The matching Works Square server source is `407c883` (local merge `0cedfc4`). No client package, production deployment, or real-account smoke occurred.
- `3b37ac3` / `55e61b7`: macOS Robot hotspot discovery performs one bounded worker-thread rescan after an empty or SSID-redacted CoreWLAN result; persistent SSID redaction maps to the existing permission error instead of a misleading empty-device state, while firmware and the open `Xiaozhi-*` contract remain unchanged.
- `f5d47c8` / `b6148a5`: AI Programming voice capture is available after an Agent is selected but before the lazy first OpenCode session exists; transcription fills the composer draft without creating an empty session, while runtime, loading, transcribing, busy, and recording guards remain unchanged.
- `4013edc` / `3b799af`: integrated per-user Code/Canvas/Learning/Robot entry policy from Works Square, projected by Electron Main as four booleans and enforced before disabled module routes initialize.
- `4013edc` / `3b799af`: historically integrated per-user Code/Canvas/Learning/Robot entry policy from Works Square. The 2026-09-04 removal narrows the current Main projection to Code/Canvas/Robot while preserving the same pre-initialization route gate.
- `01bee31`: historically enabled the AI Learning course catalog/generation/download/playback architecture. Its Learning course/runtime behavior is superseded by `38db158` above; its unrelated `game-engine` removal and project-root `planning-with-files` behavior remain historical context.
- `26b52d7`: Canvas Prompt Museum, editable server-priced generation Quotes, project deletion/task-detail workflow, cloud-default Canvas development entry, and Chinese-only UI consolidation from the authoritative remote main. Its transient bundled `game-engine` Skill is superseded by `01bee31`.
- `f8d82e6`: Prompt Museum media rendering now accepts only the server-controlled relative media route, fetches it through a Main-owned bounded Works-authenticated proxy with one refresh retry, and keeps credential-free HTTPS CDN media direct. Renderer-side validation and card-local placeholders cover invalid or failed media; attribution URLs remain optional.
@@ -555,11 +573,11 @@ Canvas 侧栏提供“获取灵感”进入 Prompt Museum。列表、筛选、
密码登录提供可选“记住密码”。该记录与七天登录会话分离,只在正式安装包且系统安全存储可用时由 Electron Main 加密落盘Renderer 仅在登录页内存中接收回填,不写 Zustand/localStorageWorks Square 也不持久化桌面密码。退出登录和短信登录不删除记录,成功的未勾选密码登录会清除旧记录。未打包开发版禁用该选项,避免未签名 Electron 调试进程触发 macOS 钥匙串。
Makelore 在会话恢复、登录和刷新后由 Electron Main 请求 Works `/api/auth/me`Renderer 只获得 Code、Canvas、Learning、Robot 个布尔权限。缺失 `module_access` 或任一字段时默认开启;服务端 `design` 显式映射客户端 `painting`。被关闭的模块卡片置灰且不可点击,根路由、深层路由和别名路由均在 `MainLayout` 或模块初始化前阻断。Code provider 等待认证权限加载完成;权限查询返回终止性 `401` 时同时清理 Main 和 Renderer 会话。`/settings` 是全局设置,不受 Code 入口策略阻断。该机制只是客户端入口策略,不代替服务端 API 授权。
Makelore 在会话恢复、登录和刷新后由 Electron Main 请求 Works `/api/auth/me`Renderer 只获得 Code、Canvas、Robot 个布尔权限。缺失 `module_access` 或任一字段时默认开启;服务端 `design` 显式映射客户端 `painting`,额外旧字段被忽略。被关闭的模块卡片置灰且不可点击,根路由、深层路由和别名路由均在 `MainLayout` 或模块初始化前阻断。Code provider 等待认证权限加载完成;权限查询返回终止性 `401` 时同时清理 Main 和 Renderer 会话。`/settings` 是全局设置,不受 Code 入口策略阻断。该机制只是客户端入口策略,不代替服务端 API 授权。
插件在编程侧栏只有一个“插件”入口,`/plugins` 是唯一产品页面,并以统一列表投影 Marketplace、账号 Library、官方设备状态、本机 Device Packages、当前项目状态与 retained IDs`/plugin-marketplace``/my-plugins``/project-plugins` 路由只做确定性筛选重定向。获取、设备安装、项目启用、Agent Skill 分配、运行授权和计费仍是独立生命周期,不因界面统一而自动推进;原生 selected-model Web Search 不进入插件列表。
AI 学习现在是已启用的运营精选项目目录,并继续受登录和 `module_access.learning` 控制。Renderer 通过 Main-owned Host API 获取分页项目卡片和 README 详情Markdown 支持 GFM、禁用原始 HTML。服务端发布时只校验图片 URL 为无凭据、默认端口、无 fragment 且当前 DNS 结果全部为公网地址的 HTTPS URL保留地址而不下载、识别格式、转码或镜像客户端仅为 README 图片节点启用直连,因此 SVG 和 Electron 支持的其他格式可直接显示单图失败不阻断详情。封面和历史发布媒体继续走受控路径。详情页的下载按钮打开系统保存对话框Main 将 ZIP 流式写入临时文件,只允许最多五跳同 Works origin 重定向,不校验 `Content-Length``archiveBytes`、实际流字节数或客户端大小上限,校验 SHA-256 和 ZIP 签名后原子保存Renderer 只接收 `saved``cancelled`。课程生成、进度、本地课程库、OpenMAIC player、Agent、ASR、课堂 runtime、Learning IPC 和 player artifact 打包已删除且没有兼容读取路径;历史课程数据保留但不再读取。服务端和客户端源码契约已完成,不代表生产部署或真实账号安装包联调已经完成
Learning 已从 Makelore 产品中移除:没有模块卡片、路由、侧栏、Renderer 页面、Main Host API、下载服务、共享 DTO、素材或打包 fallback。旧 Learning URL 回到模块选择页,旧 API 使用标准 404 边界。客户端不扫描、读取、迁移或自动删除历史课程数据;名称仍含 Learning 的冻结账号分区盐仅为跨模块持久状态兼容标识,不代表产品模块仍存在
AI 编程已经硬切到精确 pin 的 Pi `0.84.2`,不存在 OpenCode fallback 或双 runtime。project、Agent 与 Conversation 只在 `.makelore/project.json``.makelore/conversations.json` 使用本地 schema v2当前客户端不从 `.niancode``.opencode` 读取、迁移或删除项目元数据。Electron Main 按需启动一个长驻父 Agent Server每条 active/warm Conversation 在其中拥有独立 Runtime/Session/channel、credential store、extension context、generation/seq、Snapshot/Patch、model/thinking、队列、interaction 与错误状态Composer 在 lazy prepare 期间仍可编辑;正式包从 staged `pi-runtime` manifest/root 定位并校验 Pi 包入口,不从脚本目录或应用 `node_modules` 回退。Renderer 只通过 `/api/coding/*` 和 Snapshot-first/`patch-batch` SSE 消费产品中立合同gap/reconnect 只恢复目标 Conversationaccepted/uncertain mutation 不自动重放。`lifecycle:sleep` 会关闭旧事件流,视图挂载、项目上下文变化、页面重新可见或窗口 focus 会静默刷新已选 Snapshot使后台 terminal 状态收敛且不重放 mutation。隐藏 Conversation 的红点只在新 pending interaction 或新 completed/failed/aborted terminal transition 出现,不由助手/thinking/工具过程或单个工具失败触发。Session hydration 沿完整 active branch 投影可见历史Pi compaction 只改变模型上下文并保持 summary 私有Renderer 首次挂载最近 120 个节点,向上滚动时按 100 个节点追加更早内容并补偿新增高度以保持阅读锚点。折叠的 thinking、助手过程说明与工具输出固定展示第一条可见内容和首个非空行横向偏移保持为零展开后仍显示完整内容。未解析 Conversation 第一次选模先 validate 并持久化 resolved metadata再 prepare同账号模型切换使用 target `set_model`跨账号只重建目标逻辑线程。Web Search 只作为所选模型 capability 进入父 worker 并使用相同 model/provider/credential 与普通模型计费,不经过 Marketplace/Hosted client/Plugin Charge 或浏览器 fallbackchild 不继承。Conversation 工具可检查并在独立确认后安装 npm、Git、本地 Plugin 目录或 loose `SKILL.md` 为 Main-owned immutable Device Package不运行生命周期脚本可执行 extension 具有桌面用户权限,新/idle parent 自动刷新active parent 结算后刷新child 为空。每个 Main-selected generation 都保留全部显式安装且当前启用的 Skill 路径;生成的 Makelore bridge 是必需的首个 extension其余 extension 全部经 `additionalExtensionPaths` 加载,并继续关闭 ambient discovery。top-level 逻辑 turn 并发为 4warm idle logical-thread LRU 为 8independent child 进程并发为 4 并使用 FIFO 进程预算 8coding child 与 parent 共用项目 write lease。同一助手工具批次内内置 `bash`/`edit`/`write` 与声明需要该 write lease 的动态产品工具按顺序执行,避免 Pi 在批量 prepare 阶段形成租约自锁纯只读工具批次仍可并行。prompt/compact confirmation timeout 后仍保留 run/Agent-Server-or-child-process/background ownership迟到 success/failure/exit/abort 单调且 exactly-once 收敛,页面隐藏不会停止 active/uncertain run。线程级替换只使目标 generation 失效;整个 Agent Server 退出会统一使所有旧 channel 失效,但 Main/Renderer 存活且下次恢复只重启一个 Server。Pi `0.84.2` 手动 compact 不发 `agent_settled`,由 correlated compact RPC 结果终结。父 Provider credential 只进入选中逻辑线程的内存 credential storechild 凭据只进入该短命进程;确定性的 Works user-context 缺失会失效 gateway credential、fail fast、不重放并投影固定 Provider-auth 错误,不归类为 Pi crash。精确的 `403 token_point_balance_exhausted` / `词元点数余额不足` 上游响应会在 Main 内归类为不可重试的配额耗尽Renderer 只收到稳定 `CODING_PROVIDER_QUOTA_EXHAUSTED` 与安全中文提示;重开会话仍保留该提示,不暴露上游 request id 或原始错误正文。真实 Provider 验证仍为用户明确接受的未验证风险macOS arm64 仅有本地未签名 mounted-image initialize/shutdown 证据,签名/公证/完整 process-enumeration、macOS x64 与 native non-WSL Linux 仍未通过平台发布门禁。
@@ -569,6 +587,12 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Recently Completed
- 2026-09-04: Integrated the complete Learning removal onto the latest local `main`.
The module chooser, guarded routes, sidebar, auth projection, Main dispatcher,
lifecycle state, build output, and docs now contain only Code, Canvas, and Robot.
Stale Learning routes return to the chooser, the retired API is unregistered, and
historical course data remains untouched. Full unit, build, and Electron E2E gates
passed on the integrated tree.
- 2026-09-03: Reconciled local `main@7a37593` with fetched
`origin/main@8e947b4` through a normal two-parent merge. The result keeps the
reviewed single `/plugins` workspace and Device Package multi-extension
@@ -663,10 +687,9 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Next Recommended Steps
1. 在停止服务的目标数据库完成 Design V2 cutover dry-run、清零 blocker、显式 apply/validate再用成对部署的服务端与安装包真实账号执行 direct edit、chat edit、Quote request/confirm、后台完成、结果下载和 interrupted unknown-result replay smoke paid Provider activation 另行授权。
2. 部署 Works `module_access` migration 与 `/api/auth/me` 权限 API打包新 Makelore 客户端,再用真实账号分别关闭 Code、Canvas、Learning、Robot 执行卡片、根/深层/别名路由 smoke同时独立验证模块 API 服务端授权。
3. 部署 Works Square Learning 项目管理、对象存储、README HTTPS URL 校验和 list/detail/media/archive API再使用真实账号验证发布/下架、分页、远程 README 图片(含 SVG、失效 origin 和隐私提示、ZIP 校验/保存以及 Windows 与签名 macOS 安装包
4. 对 default-on Guided Hotspot Binding 核对指定固件镜像与六位码发行/消费契约,补齐 Windows 真机热点连接、签名 macOS x64/arm64 CoreWLAN/CoreLocation/worker 打包验证、真实 Host API/native seam Electron E2E 和完整真机 smoke发布支持保留精确 `=0` 回滚,不把缺失证据表述为已验收
5. 成组核对客户端 source+built+contract 上传 → 服务端逐字节校验 → OSS immutable Release → CDN/Edge 的发布契约与客户端 `play_url` 消费契约。
2. 部署 Works `module_access` migration 与 `/api/auth/me` 权限 API打包新 Makelore 客户端,再用真实账号分别关闭 Code、Canvas、Robot 执行卡片、根/深层/别名路由 smoke同时独立验证模块 API 服务端授权。
3. 对 default-on Guided Hotspot Binding 核对指定固件镜像与六位码发行/消费契约,补齐 Windows 真机热点连接、签名 macOS x64/arm64 CoreWLAN/CoreLocation/worker 打包验证、真实 Host API/native seam Electron E2E 和完整真机 smoke发布支持保留精确 `=0` 回滚,不把缺失证据表述为已验收
4. 成组核对客户端 source+built+contract 上传 → 服务端逐字节校验 → OSS immutable Release → CDN/Edge 的发布契约与客户端 `play_url` 消费契约
## Open Questions / Blockers
@@ -674,9 +697,9 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Risky Areas
- 模块权限只控制 Makelore 客户端入口和初始化,不是 API 授权边界。不得因卡片置灰或路由阻断而放宽 Works/模块服务端的身份与权限校验;旧服务端缺少对象/字段时默认开启是显式兼容策略。
- 模块权限只控制 Makelore 客户端入口和初始化,不是 API 授权边界。不得因卡片置灰或路由阻断而放宽 Works/模块服务端的身份与权限校验;旧服务端缺少对象/字段时默认开启是显式兼容策略。
- Prompt Museum 相对媒体必须保持固定的服务端路径并由 Main 处理;如果服务端增加媒体变体,需同步维护 entry/path 语法、Works Bearer 所有权、单次刷新、10 MiB 限制、可信 raster MIME 白名单与 Renderer data URL 校验。HTTPS 直连媒体必须继续无凭据,图片失败必须局限在卡片/详情视图。
- Learning 项目目录依赖真实 Works 运营发布和固定 API 契约README 图片只允许服务端校验后的无凭据 HTTPS URL并由 Markdown 图片节点直接加载,不得扩展为任意网络或归档代理。第三方 origin 的可用性、格式支持和请求隐私是已接受边界。Main 必须保持 Bearer 所有权、封面/历史媒体受控读取、一次 401 refresh、同源最多五跳、SHA-256/ZIP 签名和原子保存客户端下载明确不执行大小门禁不得把上游错误、Token、对象存储 URL 或本地路径投影到 Renderer。历史课程数据不再读取也不得被隐式删除。
- Learning 必须保持完全退役不得因旧链接、旧服务端字段或历史数据而恢复入口、路由、API、下载或打包 fallback。历史课程数据不再读取、迁移,也不得被隐式删除。
- Works Project 首次封面已由服务端源 `407c883`(本地 merge `0cedfc4`)提供单请求原子绑定与失败补偿,客户端源 `145a6ce` 因此要求首次发布上传 PNG/JPEG/WebP 封面;部署、安装包和真实账号/对象存储 smoke 仍未完成。服务端仍没有已有 metadata 的 revision/ETag 与 draft-only 条件写,因此已有 draft/published 继续只允许 version-only客户端不得以无条件 PATCH 替代。
- Guided Hotspot Binding 默认开启并提供未经认证的热点扫描/显式连接,但当前 Hotspot/portal 仍是开放 SoftAP + 明文 HTTP且精确出货镜像、激活码发行契约、签名 macOS、Windows 真机与完整整链尚未验证。界面必须保留环境警告,异常发布可用精确环境值 `0` 回滚;不得把 SSID 前缀宣称为可信设备发现、自动认领或在线证明。
- 一键提交已成功但本机 submission binding 落盘失败时必须保持提交成功、显示固定 `binding_warning` 并继续轮询,避免用户误判上传失败。

View File

@@ -0,0 +1,99 @@
# Task: Integrate Learning module removal
## Identity
- Task ID: 20260904-integrate-remove-learning-6e4a9c21
- Mode: Integration
- Branch: main
- Worktree: /Users/inmanx/Documents/makelore
- Base commit: bdc290c2cffee6eebbc1b1a6826edad3f830572a
- Owner: codex
- Status: Ready for Integration
## Scope
- Integrate source task `20260903-remove-learning-7a91` at commit
`5a7cb9b2085848631bdf7de45fe1cac74b905ed9` onto the latest local `main`.
- Preserve later `main` work, especially the conversation-first AI Design changes, while
removing the Learning module from Renderer, Main, tests, assets, packaging, and docs.
- Promote the accepted three-module product boundary into canonical project memory and
supersede the Learning-specific decision and release commitments.
- Verify the merged product on the latest `main`, then start the desktop development app.
## Intent And Constraints
- The user explicitly confirmed on 2026-09-04 that Learning should remain removed; this
is the human decision required to supersede ADR-005.
- Keep Code, Canvas, Robot, authentication, updater, Plugins, packaging, and
`/deliverables` behavior intact.
- Do not inspect, migrate, or delete historical course data.
- Preserve the literal `makelore-learning:v1` compatibility salt where it partitions
shared account state; its name is not an active Learning product surface.
- Do not restore a Learning fallback route. Stale Learning URLs should resolve through
the normal module chooser behavior.
- Source task records are read-only during integration.
## Project Context Loaded
- Concurrent Task Gate passed in Integration mode on the root `main`; this task held
the exclusive integration lock and the completed source task remained isolated.
- Planning Gate passed after reading the source record, integrated current state,
ADR-005, decision index, architecture, domain rules, success criteria,
commitments, and stale registry.
- The user's explicit 2026-09-04 confirmation resolves the semantic conflict with
accepted ADR-005 and authorizes the three-module canonical product state.
- `project-positioning.md` remains a project-wide placeholder; the populated README,
AGENTS guidance, decisions, architecture, domain, and current-state records provide
the concrete product boundary for this integration.
## Outcome
- Cherry-picked source `5a7cb9b2085848631bdf7de45fe1cac74b905ed9`
onto the latest local `main` as `bd0873f34823754760368d8d37703c74bf65106d`.
- Resolved README and Plugin Marketplace E2E conflicts by preserving the newer
unified Plugin workspace and AI Design behavior while removing Learning policy data.
- Makelore now exposes only Code, Canvas, and Robot across module selection, guarded
routing, sidebar projection, auth state, desktop lifecycle, Host API dispatch, and
build output.
- Promoted the accepted three-module boundary into canonical decisions, architecture,
domain rules, success criteria, glossary, current state, and commitments. ADR-005
and the Learning deployment commitment are superseded.
- Learning implementation files, routes, DTOs, assets, tests, and server contract stay
deleted. Negative retirement tests and the frozen `makelore-learning:v1` shared
account-partition salt are the only intentional implementation references.
- Historical course data was neither inspected nor changed.
## Verification
- `corepack pnpm install --frozen-lockfile` passed with pnpm `10.33.4`.
- `corepack pnpm run typecheck` passed.
- Focused Vitest passed 8 files / 109 tests covering module access/navigation,
App/provider gates, auth route/store, lifecycle, Main layout, and Host dispatch.
- `corepack pnpm run lint:check` completed with 0 errors and 12 existing warnings:
5 in current unchanged UI files and 7 under the historical
`.worktrees/learning-player-release-fix` tree.
- `corepack pnpm run build:vite` passed for Renderer, Main, Preload, and release
utility. The output contains Code, Canvas, and Robot module assets and no
Learning-named asset or chunk.
- `corepack pnpm test` passed 220 files / 1,844 tests with 3 skips; the isolated
pressure suite passed 1/1.
- Targeted Electron E2E passed 8/8 across module navigation, retired Learning route,
unified Plugins, and the latest Canvas flow.
- Full Electron E2E passed 33/33 with 1 Windows-conditional skip.
- Source/reference audit found no active Learning file, import, route registration,
API constant, product copy, or build artifact. `git diff --check` passed.
- Project-doc completeness and task-aware Integration Gate drift checks passed after
confirming the source task record remained byte-identical in its source branch.
## Follow-ups
- The existing real-account module-access release commitment now covers Code,
Canvas, and Robot only. No Learning service deployment or package acceptance remains.
- No remote push, packaged-client install, production deployment, or publication was
performed by this integration.
## Promotion Candidates
- Applied all source promotion candidates to canonical decisions, architecture,
domain rules, success criteria, glossary, current state, and commitments. No
unresolved Learning promotion candidate remains.

View File

@@ -79,7 +79,7 @@
- `works-cloud-deploy.json` 仅是已安装客户端的数据兼容文件名,不表示客户端仍提供 cloud deployment coordinator。
- Works Square 会话按真实键盘、鼠标或触摸活动滑动续期,连续 7 天未使用才要求重新授权。
- “记住密码”是独立于七天会话的可选桌面凭据记录:只能由 Electron Main 在正式安装包中通过可用的系统安全存储加密落盘,账号密码不得进入 Renderer 持久状态、日志或 Works Square 持久化。退出登录和短信登录保留记录;只有成功的未勾选密码登录清除旧记录。系统安全存储不可用或未打包开发版必须禁用该选项。
- 运营端可按用户关闭 Code、Canvas、Learning 或 Robot 客户端入口默认全开。Makelore 通过 Main-owned `/api/auth/me` 只消费布尔安全投影;缺失 `module_access` 或字段按开启处理,服务端 `design` 对应现有客户端 `painting`
- 运营端可按用户关闭 Code、Canvas 或 Robot 客户端入口默认全开。Makelore 通过 Main-owned `/api/auth/me` 只消费布尔安全投影;缺失 `module_access` 或字段按开启处理,服务端 `design` 对应现有客户端 `painting`,额外旧字段被忽略
- 关闭的模块卡片必须置灰且无法点击;其根路由、深层路由和别名路由必须在 `MainLayout` 或模块初始化前阻断。Code provider 只能在 auth policy hydration 完成且 Code 已开启时初始化;`/settings` 是全局设置,不得随 Code 关闭而失去访问。
- 模块置灰/路由阻断不是 API 授权边界。每个 Works/模块服务端 API 仍必须独立执行身份与权限检查;`/api/auth/me` 返回终止性 `401` 时必须清理 Main 和 Renderer 会话,不得以默认全开继续。
- Makelore Code 的唯一 production runtime 是精确 pin 的 Pi `0.84.2`。不得恢复 OpenCode fallback、RPC/SDK 双轨、兼容执行路径或 Renderer runtime 直连;产品公共合同必须保持 project/Agent/Conversation/Snapshot/Patch 中立Pi wire 只属于 Main。
@@ -109,11 +109,7 @@
- Prompt Museum 只展示服务端审核并带稳定作者、来源、许可证/署名和素材授权信息的内容;客户端不内置数据集、不推断缺失版权、不提供投稿/点赞/评论/收藏/关注/排行,也不自动发送或生成选中的 Prompt。
- Prompt Museum Renderer 只能通过 Main-owned 固定 GET 路由读取列表和详情。Works Token 不得进入 Renderer列表查询只允许搜索、使用场景、风格、主体、语言、模型、游标和限制字段。需要受保护图片时必须新增 Main-owned 媒体代理,不能把 access token、内部路径或用户隐私放进图片 URL。
- 产品界面当前只支持中文;系统语言与历史持久设置中的其他值必须归一为 `zh`,不得保留不可达的伪语言选择。
- Learning 是登录必需且受 `module_access.learning` 控制的运营精选项目目录。客户端只提供项目列表、README 详情和用户触发的 ZIP 下载不提供课程生成、进度、本地课程库、OpenMAIC 播放、Agent、ASR 或课堂 runtime也不保留旧 API/数据兼容读取路径
- Works Square 运营后台拥有项目名称、摘要、封面、标签、版本、排序、状态、Markdown、ZIP、声明字节数和 SHA-256。只有冻结了元数据、媒体和归档校验结果的 `published` 项目可被客户端列表或详情读取;客户端不提供上传、编辑或发布入口。
- README 使用安全 Markdown/GFM 并禁用原始 HTML。运营发布时必须解析 Markdown只保留无凭据、默认端口、无 fragment 且当前 DNS 全部指向公网地址的 HTTPS 图片 URL不得下载、识别格式、转码或镜像 README 图片。客户端仅允许 Markdown 图片节点直连这些 URL支持范围和可用性由 Electron 与远程 origin 决定;封面和历史发布媒体继续走受控媒体路径。
- Main 打开原生保存对话框,将项目 ZIP 下载流写入临时文件,只允许无 userinfo、最多五跳且保持 Works origin 的重定向,重定向请求不携带 Bearer客户端下载不校验 `Content-Length``archiveBytes`、实际流字节数或大小上限,只在 SHA-256 与 ZIP 签名匹配后原子重命名。Works Square 可保留独立的运营上传/存储限制。Renderer 不得获得 Works Token、对象存储地址、任意下载 URL、临时路径或最终本地路径。
- 新客户端不读取、迁移或展示历史下载课程,但也不自动删除用户现有课程数据。任何清理功能必须另行设计为用户明确控制的可恢复维护动作。
- Learning 已从产品入口、路由、Renderer、Main Host API、共享 DTO 和打包资源中移除,不保留兼容实现。客户端不读取、迁移或展示历史下载课程,也不自动删除用户现有课程数据;任何清理功能必须另行设计为用户明确控制的可恢复维护动作
- `game-engine` 不再是内置 Coding Skill。`planning-with-files` 在复杂任务中把 `task_plan.md``findings.md``progress.md` 写到当前项目根目录;不得写入 Skill 安装目录或用户目录。
- Robot V1 在现有 Binding 体验内扫描符合条件的开放 `Xiaozhi-*` 配网热点,并只连接用户明确选择的短效候选;该便利信号不得宣称为可信设备发现、自动下发家庭 Wi-Fi、自动认领或自动确认在线。
- Guided Hotspot Binding capability 由 Electron Main 持有且默认开启。精确 `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` 关闭引导;关闭或 capability 读取失败时保留现有六位码 BindingRenderer 可以读取但不能覆盖它。
@@ -137,8 +133,7 @@
- AI Canvas V2 仍需安装包真实账号 smokedirect edit、chat edit、Quote request、confirmation、background completion、result download 与 deliberately interrupted unknown-result retry生产 Provider 激活需另行授权。
- Robot Guided Hotspot Binding default-on 发布仍需确认指定硬件/固件确实提供被审计的开放 Hotspot/Portal、部署端签发严格六位 ASCII 数字码且与 Works validator 的时效/消费语义一致,并完成 Windows 真机、签名 macOS x64/arm64 native worker/association 与真实设备端到端 smoke。
- Prompt Museum 客户端契约和页面完成不等于 Works Square 内容后台、审核数据或 CDN 已部署;上线前需以真实登录账号验证列表、详情、署名链接、分页、图片和 Prompt 回填。
- Learning 客户端集成不等于 Works Square 运营后台、对象存储或项目 API 已部署;上线前需先部署服务端合同,再以真实账号验证发布/下架、分页、远程 HTTPS README 图片(含 SVG 与失败隔离)、保存取消、缺失或错误 `Content-Length` 的 ZIP、摘要/签名错误以及 Windows/签名 macOS 安装包
- 四模块入口策略上线前需确认 Works `module_access` migration/API 已部署,安装包包含对应客户端,并用真实账号逐一关闭四个模块验证卡片、根/深层/别名路由和独立 API 授权。
- 三模块入口策略上线前需确认 Works `module_access` migration/API 已部署,安装包包含对应客户端,并用真实账号逐一关闭 Code、Canvas、Robot 验证卡片、根/深层/别名路由和独立 API 授权
- Makelore Code 已有 Windows x64 最终安装包证据、WSL2/WSLg Linux 证据,以及 macOS arm64 本地未签名 DMG 的 mounted-image Agent Server initialize/shutdown 证据。macOS arm64 的签名/公证与完整 process-enumeration gate、macOS x64、native non-WSL Linux desktop/compositor 仍未验收;在补齐前不得宣称 cross-platform release-ready。真实 Provider 风险虽经用户明确豁免,但仍不得从 loopback/provider-shaped smoke 推断为真实 Provider Pass。
## Last Reviewed

View File

@@ -19,10 +19,6 @@
| Design Generation Quote | 服务端对当前最终 Prompt 与 generation parameters 返回的可确认报价 | 客户端可编辑后请求重报价,但不自行计算尺寸、供应商价格或设计点 |
| Prompt Museum | Canvas 的服务端驱动、只读策展灵感模块 | 展示经审核的预览、Prompt、分类和署名不是社区客户端不打包内容数据集 |
| Pending Museum Prompt | 用户点击“使用此 Prompt”后在 Renderer 进程内保存的一次性回填状态 | Canvas 消费后清除;只填充输入框,不自动发送或生成 |
| Learning Project | Works Square 运营发布、供用户阅读 README 并下载源码/素材 ZIP 的精选学习项目 | 客户端只读;不是课程、生成任务或本地播放器实体 |
| Published Learning Project | 在一个发布代际中冻结名称、封面、Markdown、镜像媒体、ZIP 字节数和 SHA-256 的公开项目快照 | 只有 `published` 状态进入客户端列表/详情;下架后不可见,审计记录保留 |
| Learning Project Media | README 远程 HTTPS raster 图片经服务端校验、镜像后生成的固定项目媒体资源 | 客户端只接受固定 `/api/learning/projects/:projectId/media/:mediaId` 路径Main 验证可信 MIME 和 10 MiB 上限 |
| Learning Project Archive | 用户在详情页明确选择保存的项目 ZIP | Main 负责原生保存窗口、受控下载、SHA-256、ZIP 签名和原子重命名;不按大小字段或客户端上限阻断,也不在客户端形成课程库 |
| Robot Provisioning | 让 Robot 获得目标 Wi-Fi 凭据并尝试联网的阶段 | 与云端 Activation、账号 Binding、协议在线是不同阶段V1 由现有固件 Hotspot portal 完成 |
| Robot Activation | Robot 联网后向既有服务获取六位激活码的阶段 | 激活码由设备展示/播报给用户Makelore 不生成该码 |
| Robot Binding | 用户把六位激活码和 Agent 提交到 Works Square建立账号侧设备关系 | `bound` 不等于设备当前 online 或 protocol-ready |

View File

@@ -7,8 +7,8 @@ Track future-facing memory: promised follow-ups, unfinished loops, timed checks,
| 2026-08-21 | 验收修复后的真实本地 OpenCode Session 模型切换 | OpenCode runtime 尚存时 | 客户端/OpenCode 集成 | Superseded / Closed | Pi hard cutover 已删除该 runtime 与 native Session model wire不得再执行或恢复此验收。当前 Conversation 模型规则由 ADR-006、schema v2 与 target Pi worker contract 约束。 |
| 2026-08-19 | 验收 AI Design 有限请求生命周期并决定正式 HTTP/2 策略 | 发布包含源 `87e4140` 的正式安装包前 | 客户端/Works 服务端/发布集成 | Pending | 使用真实账号连续执行 Quote PATCH、重试报价与继续调整制造或等待慢响应确认 30 秒内稳定返回、其他请求不被共同挂住、服务端无隐式重复 mutation随后恢复 HTTP/2 重新打包做同场景对照。只有证据确认后才能移除临时 `disable-http2` 或把协议策略固化为正式决定。 |
| 2026-08-17 | 验收 AI 编程真实 Provider 双 Conversation 行为 | 未来撤销用户豁免,或对外宣称真实 Provider 并发/凭据隔离已经验证前 | 客户端/Pi/provider 集成 | Explicitly Waived / Accepted Risk | 当前 `realTurnVerified=false`。若重新开启验收必须覆盖真实认证、endpoint/proxy/rate-limit、四协议响应与图片差异、真实并发或串行、abort/event/session/model/credential 跨 worker 隔离provider-shaped loopback 与 4+4 本地 PID 证据不能替代该验证。 |
| 2026-08-17 | 验收用户级模块入口策略的真实发布链 | 发布包含源 tip `3b799af` 的 Makelore 安装包前 | Works 服务端/客户端/发布集成 | Pending | 部署 `module_access` migration 和 `/api/auth/me` API重新打包并安装 Makelore使用真实账号依次关闭 Code、Canvas、Learning、Robot重启后验证卡片置灰/不可点、根/深层/别名路由阻断、`/settings` 仍可访问和 terminal `401` 退出;另行以直接 API 请求确认服务端授权,不以 UI 置灰代替 |
| 2026-08-20 | 部署并验收 AI Learning 项目目录完整链路 | 发布包含源 `38db158``9956739``8509084` Makelore 安装包前 | Works 运营后台/服务端/客户端/发布集成 | Pending | 实现并部署项目管理、对象存储、发布代际、README HTTPS URL 校验、list/detail/media/archive API以真实账号验证发布/下架、排序分页、README/GFM/远程图片(含 SVG、失效 origin 和请求隐私说明)、原生保存取消、同源重定向、缺失或错误 `Content-Length` 时仍可下载、SHA-256/ZIP 签名失败和 Windows/签名 macOS 安装包。客户端下载不再验证 `archiveBytes`、实际字节数或大小上限;不得以客户端测试宣称运营后台或生产数据已上线 |
| 2026-08-17 | 验收用户级模块入口策略的真实发布链 | 发布包含 Learning 移除集成 `bd0873f` 的 Makelore 安装包前 | Works 服务端/客户端/发布集成 | Pending | 部署 `module_access` migration 和 `/api/auth/me` API重新打包并安装 Makelore使用真实账号依次关闭 Code、Canvas、Robot重启后验证卡片置灰/不可点、根/深层/别名路由阻断、`/settings` 仍可访问和 terminal `401` 退出;另行以直接 API 请求确认服务端授权,不以 UI 置灰代替 |
| 2026-08-20 | 部署并验收 AI Learning 项目目录完整链路 | Learning 已于 2026-09-04 从 Makelore 移除 | Works 运营后台/服务端/客户端/发布集成 | Superseded / Closed | 不再为 Makelore 客户端部署或验收 Learning 项目目录 API。历史课程数据保持不读、不迁移、不自动删除如未来恢复 Learning必须重新作产品决定和 ADR。 |
| 2026-08-17 | 验收首次项目封面并补齐已有资料条件写 | 发布包含源 `145a6ce` 的 Makelore 前,或启用 draft/published metadata 编辑前 | Works 服务端/客户端发布集成 | Partial / Pending | 首次封面已由服务端源 `407c883` 与客户端源 `145a6ce` 通过单请求绑定和失败补偿落地;仍需先部署服务端、重新打包客户端,并以真实对象存储/账号验证 404→create 409、cover 失败和版本阻断。已有资料编辑继续等待 metadata revision/ETag 与 draft-only 条件写;在此之前保持 existing version-only。 |
| 2026-08-16 | 验收 Prompt Museum 与 Canvas 删除/重报价的真实服务端链路 | 发布包含 `26b52d7` Canvas 行为的安装包前 | 客户端/服务端集成 | Pending | 使用真实 Works 账号核对 Museum 列表/详情/分页/筛选/署名/CDN/Prompt 回填,并确认固定相对媒体路径可经 Main Bearer 代理、401 刷新、10 MiB/可信 raster MIME 边界后在 Renderer 展示;核对最终 Prompt/options 重报价和确认设计点;删除 Workspace 后确认软删除可见性、未提交任务取消/预留积分释放、已运行任务结算。保留 Main 错误脱敏和严格 DTO/HTTPS 投影,不以客户端回归替代服务端验收 |
| 2026-08-16 | 验收 default-on Robot Guided Hotspot Binding 的 Windows/macOS 真实设备链路 | 下一份包含页面内热点连接行为的安装包发布前 | 客户端/硬件/服务端集成 | Pending | 核对精确出货固件与固定 Portal、六位码发行/消费语义;执行 Windows Robot 真机扫描/连接、签名 macOS x64/arm64 CoreLocation/CoreWLAN/worker/ASAR/Koffi smoke以及真实 Host/native Electron 端到端配网+Binding保留 `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` 回滚并记录支持矩阵 |