<!-- 受众: AI(直接投喂) | 用途: 一份就让 AI 一次读懂全局,自包含,可整段发送 -->
<!-- 这是发给 AI 的"全局速成"。人类一页速览在 ../给人看/总说明-一页速览.md 。 -->
🧠 一次读懂全局 · 发给 AI 的全局速成#
这整篇都可以直接整段发给 AI。它是自包含的:读完这一份,AI 就掌握了项目全貌、
唯一正确的改代码姿势、红线、常见错误、以及怎么接活。细节再指向本包其它四份分册。
(若对方是小模型/上下文小,别发这份,发项目情况说明-开场白.md的 C 档即可。)
你现在要协助维护和开发 Khy-OS。这一份让你一次读懂全局,读完即可按规矩开工。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一、这是什么项目
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Khy-OS = 自研 x86_64 C 内核 + Node.js AI 后端 + host 桥(agent⇄OS) + Python(pip) 启动器。
- 内核:kernel/(C + 少量 MoonBit + 汇编),QEMU 可启动。
- AI 后端:services/backend/(业务主体在此,Node.js),命令名 khy,是 CLI/TUI 跨模型助手。
- 分发:pip 包名 khy-os,pip 启动器是薄壳,真正跑的是 Node 后端。
两条现实约束(决定一切取舍):
1. pip 是唯一分发渠道。改动最终要能打成 wheel 发布;pip 包是打包时的源码快照,
改了仓库源码必须重新打包才对已安装用户生效。
2. 项目要能被"一个人、甚至非工程师、没有强 AI"继续维护。
所以稳定 > 可回退 > 守卫可拦 > 炫技。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
二、我要改 X 去哪
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- CLI 命令/路由:services/backend/src/cli/router.js(大 switch)→ handlers/
- AI 网关/模型路由:services/backend/src/services/gateway/aiGateway.js → modelRouter.js
- 本地离线能力(算/文本/找文件/上下文):services/backend/src/services/localBrain*.js
- 工具调用主循环:services/backend/src/services/toolUseLoop.js
- 唯一工具执行漏斗:services/backend/src/services/toolCalling.js 的 executeTool()
- 前端:apps/ai-frontend/(AI)/ software/khyquant/frontend/(量化应用)
- pip 启动:platform/khy_platform/cli.py
- 先读的地图与红线:.ai/MAP.md、.ai/GUARDS.md、.ai/GUARDS-AI.md、.ai/CONTEXT.yaml
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
三、改代码只有一种正确姿势(务必遵守)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
"加法式改动 + 纯叶子模块 + 默认开的 KHY_* 门控 + 关闭即逐字节回退":
R1 加法式:新逻辑只加不改;先 grep 有没有现成实现可复用;绝不为同一概念写第二份真源。
R2 纯叶子:新逻辑写成一个纯叶子——零 IO、确定性、绝不抛异常(坏输入返安全默认)、可单测、不 require 重依赖。
R3 门控:用一个 KHY_XXX 环境变量门控,默认开;登记 services/backend/src/services/flagRegistry.js;父门控关→子门控必关。
R4 逐字节回退:KHY_XXX 关闭时行为和改动前逐字节相同;接线处 try/catch,叶子异常 fail-soft 回退旧行为。
R5 严格超集:只在旧路径漏做/做错处补正,绝不改变既有正确路径输出;安全向只多封锁/多清理,不放宽。
R6 真接线:必须能从 executeTool(toolCalling.js)/toolUseLoop.js/aiManagementServer.js 之一被 require 到才算"在产";隔离单测全绿≠在产。
R7 守卫绿:改完跑相关单测;提交前守卫 scripts/check-*.js(git 钩子自动触发)必须全绿;绝不用 git --no-verify 跳过。
R8 不建上帝组件:单文件不超 2500 行;拆分把内聚分节抽成纯叶子,原文件同名别名 re-export 保契约。
R9 诚实收尾:如实说测了什么/几个绿/跳过了什么/哪些没做;不把"跑了工具但没交付结论"当做完。
纯叶子模板:
function isEnabled(env=process.env){try{const v=env&&env.KHY_XXX;
if(v==null)return true;return !['0','false','off','no'].includes(String(v).trim().toLowerCase());}catch{return true;}}
function decide(input){try{/*纯计算,坏输入返安全默认*/ return {ok:true,value:/*...*/};}catch{return null;}}
接线模板:
let result=legacyValue; try{const leaf=require('./xxxGuard');
if(leaf.isEnabled(process.env)){const d=leaf.decide(input); if(d)result=d.value;}}catch{/*保持 legacyValue*/}
验回退:临时 KHY_XXX=off 跑同输入,输出应与改动前逐字节相同。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
四、绝不能做的事(红线)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 不绕过 executeTool 另开工具执行旁路(会绕过权限门控与审批)。
- 不为同一概念建第二份真源(约束格/能力向量/错误分类/破坏性动作模式库等各有唯一权威实现,见 .ai/GUARDS-AI.md §2)。
- 单文件不超 2500 行。
- 没接到三真实入口之一,就不许声称"已落地/已接入"。
- 不用 --no-verify 跳过守卫。
- 观测模式(observe)里写阻断/改写会被静默忽略;门面类(Coordinator)无 import 是死的,改它不影响线上。
- fail-open vs fail-closed 别搞反:能力/约束求解异常 fail-open 回旧管线;红线/审批判定必须 fail-closed。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
五、我最容易犯的错(自查摘要,详见错误自查手册)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
P 类(流程):P1 假装做完(没接线);P2 造第二份真源;P3/P4 忘门控/破坏回退;
P5 只报进度不交付结论;P6 想绕守卫;P8 幻觉引用不存在的文件/函数;P9 堆成上帝组件。
W 类(小模型):结果过大撑爆上下文、max_tokens 太低截断、role:'tool' 被拒、JSON 包在代码块里解析不出——别破坏已有兼容层。
B 类(代码缺陷原型,写新代码时对照):裸 startsWith 边界未锚定、大小写未折叠、正则缺锚点、越界码点崩溃、
密钥脱敏漏现代 key、cron step=0 死循环、slice(-0) 语义反转、闭包捕获过期 resolve/监听器泄漏、
字符集乱码、SSRF 等价表示形绕过、破坏性命令 flag 大小写/顺序敏感、数值格式边界错档、阈值小窗口下溢为负。
通用预防:处理外部输入/安全判定时问——边界锚定?大小写折叠?越界/空/0/负?坏输入崩还是 fail-soft?等价形都覆盖?
G 类(网关):G1 模型名泄漏给不认识它的通道致 404;G2 默认值散落硬编码;G3 鉴权形态过时;G4 请求侧新字段被丢;G5 视觉模型误判纯文本退回 OCR。
E 类(环境):Node≥20;改源码没重打包 pip 用户拿不到;版本号多处不一致;node:test 传文件别传目录、别与 jest 混跑。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
六、干活前后各做一次自检
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
动手前(只读体检):node services/backend/bin/khy.js maintain freshness
接手先确认命脉没退化:守卫全绿? 版本号一致? 上帝组件没恶化(npm --prefix services/backend run arch:god)?
改完后:相关单测 + 提交前守卫全绿。在产自查:
grep -rl "require(.*/<模块名>" services/backend/src --include=*.js | grep -vE "/<模块名>/|tests/"
诚实收尾模板:
改了:<文件>加<KHY_门控>(默认开) | 接线:从<哪个真实入口>可达 |
回退:KHY_门控=off 逐字节等价(已验/未验) | 测试:<X/Y绿> 守卫:<全绿/哪个红> | 没做/存疑:<列出>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
七、语言 & 收尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
交流与文档用中文;代码标识符/字符串字面量用英文。
每步开始前先说:要改哪个文件、加哪个 KHY_ 门控、关掉后怎么逐字节回退——我确认后再动手。
重要治理写一行到 .ai/GOVERNANCE-LEDGER.md;新文档回写 00_INDEX。
现在确认你已读懂以上全局。等我给你具体任务,不要立刻改任何文件。
读完这份后,按需再要这些分册(都在本包 给AI看/)#
- 开场白分档(强/普通/小模型)+ 场景补丁块:
项目情况说明-开场白.md - 铁律速查卡 + 代码范式展开:
协作铁律.md - 错误自查手册全条目(P/W/B/G/E):
错误自查手册.md - 可直接当需求的任务卡(T1–T5 / M1–M5 / F1–F4):
任务派发卡.md