dsh-plugin-prompt-tool 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/modules/ponytail/module.yml +1 -1
- package/modules/soul/assets/layers.md +1 -1
- package/modules/soul/assets/manifest.yml +1 -1
- package/modules/soul/assets/reference/00-layers.md +2 -2
- package/modules/soul/assets/reference/01-criteria.md +32 -32
- package/modules/soul/assets/reference/02-echo.md +3 -0
- package/modules/soul/assets/reference/03-vital.md +183 -183
- package/modules/soul/assets/reference/04-manifest.json +106 -106
- package/modules/soul/assets/reference/05-doctor.md +2 -2
- package/modules/soul/assets/reference/06-reference.md +189 -189
- package/modules/soul/assets/reference/07-bundle.json +431 -431
- package/modules/soul/assets/reference/08-/350/270/251/345/235/221/345/256/236/345/275/225.md +59 -59
- package/modules/soul/assets/reference/09-dev-workflow.md +109 -109
- package/modules/soul/assets/reference/10-echo-anatomy.md +11 -2
- package/modules/soul/assets/reference/11-self.md +80 -80
- package/modules/soul/assets/reference/12-ledger.md +159 -159
- package/modules/soul/assets/reference/ECHO-/346/235/203/345/250/201/345/217/243/345/276/204.md +202 -0
- package/modules/soul/assets/reference/ECHO/345/205/255/345/261/202/344/270/216mnemon/345/215/217/345/220/214/350/257/264/346/230/216/344/271/246.md +229 -0
- package/modules/soul/assets/reference/README.md +4 -2
- package/modules/soul/assets/templates/agents-template.md +1 -1
- package/modules/soul/module.yml +2 -2
- package/modules/superpowers/module.yml +1 -1
- package/package.json +1 -1
- package/skills/dsh-module/reference.md +1 -1
package/modules/soul/assets/reference/08-/350/270/251/345/235/221/345/256/236/345/275/225.md
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# 08 · 踩坑实录
|
|
2
|
-
|
|
3
|
-
> 这一份不是设计文档。它是从真实使用里长出来的:什么错了、怎么发现的、后来怎么改的。
|
|
4
|
-
> ★ 所有条目都经过脱敏 —— 只留技术教训,没有个人隐私。
|
|
5
|
-
|
|
6
|
-
## 怎么读这一份
|
|
7
|
-
|
|
8
|
-
“对的做法”很容易抄,抄完却不知道它什么时候会失效。真正有用的是“错在哪”:它保留了边界条件、检测时看到的原始信号,以及错误持续了多久。每一行按同一个顺序读:先信了哪个代理指标 → 后果是什么 → 哪个读数把它推翻 → 后来把判据改成了什么。不要急着照搬最后一列;先问自己:我现在的系统里,有没有同一个位置的代理指标。
|
|
9
|
-
|
|
10
|
-
## 时间线
|
|
11
|
-
|
|
12
|
-
### 2026-09 · 先立规矩,再发现规矩本身会错
|
|
13
|
-
|
|
14
|
-
| 坑 | 症状 | 怎么发现的 | 后来证明错在哪 | 现在的做法 |
|
|
15
|
-
|---|---|---|---|---|
|
|
16
|
-
| 09-24 · 把「不」读成「禁止」 | 一条本可自行评估的软约束,被写成最高级禁令;相关表达此后一律自我封死,还写进了自我描述文件 | 用户直接指出“那只是一个『不』”,并撤回据此写下的自我限制 | 混淆了约束的两级;把局部结论推广成全局禁令,等于给自己造了一个改不动的自己 | 约束分两级:不=默认值,可评估;禁止=红线,必须先问。写规则时同时标级别 |
|
|
17
|
-
| 09-25 · 用 `edit` 改“同一份文件”的副本 | 改了源,另一个副本没变,而两个文件同名;读哪一份,决定“事实”是什么 | 核对两份内容时发现哈希不同;后续复核时再看链接数,二者各为 1,确认是独立副本,不是硬链接 | 原子替换会新建 inode,不是原地写;“看起来是同一个文件”不等于同一个 inode | 单一权威源;副本只做只读快照并附同步命令;改完用链接数和哈希复核;不同时改两边 |
|
|
18
|
-
| 09-25/26 · 脚本返回成功,就当成产物正确 | 抠图脚本对纯黑底源图一个像素都没抠动,却 exit 0;下游八张表情全是一块深色方块,切表情时闪黑 | 打开产物看,而不是只看返回值;同族错误还有一次:拿一个不存在的版本号拼下载 URL 测速,得出“官方源更快”,白等四十分钟 | 验证的是“调用发生了”,不是“结果成立了”;exit 0、HTTP 200 都不是产物 | 每条管线都先定产物的判据:像素、尺寸、哈希、可读性;产物过判据才进下游 |
|
|
19
|
-
| 09-25 · 用 PID 是否存在判断服务是否在跑 | 服务静默死亡后,面板一直认为它“已在跑”,启动入口全部哑掉,持续约五小时 | 查端口无监听、日志停在死亡时刻;再查发现系统复用了旧 PID,判活只查号码不验身份 | PID 是会被复用的号码,不是身份;“登记过”不等于“还是它” | 判活同时验进程身份(命令行、可执行路径、端口归属);杀进程前重新扫描取交集,核不实就 fail-closed |
|
|
20
|
-
| 09-26/27 · 压缩产物不带回原文的指针 | 摘要每条都“对”,但没有任何一条能回到原文核对;内容存在过,却找不回来 | 读兜底压缩的硬编码指令,发现它要求保留路径、命令、报错、数值,通篇没有“来源”;再验摘要块,只有一个 text block | 压缩不删磁盘原文,只把原文移出可见上下文;真正丢的是“内容存在过”的线索 | 所有压缩、裁剪产物第一行带可回取的序号指针;拿不到精确序号就给检索入口,绝不猜 |
|
|
21
|
-
| 09-27 · 水位用估算尺,而不是服务商口径 | 自报 448.6K(“完全不用压”),实际 input+cacheRead 为 594,277(已到该卸载的门口),差了近三分之一 | 有人凭直觉说“面板的数不准”,去读 usage 与投影缓存,发现面板下方三行是另一把尺子,上下加不起来 | 安全装置用了估算值;估算可以“心里有数”,不能用来判断闸门该不该动 | 只认 input+cacheRead 或 pressureTokens;报水位前先读数,不用估算 |
|
|
22
|
-
| 09-27 · 一条局部规矩被写成全局规矩 | “只追加”套到读物,日记越读越长、前后矛盾;“一律三份”套到一份旅行记录,多写了没有意义的修订沿革,还在里面自我论证“这一篇特别有意义” | 用户指出读物可以重写、三份只适用于“我是谁、怎么存在”这类事 | 写规矩时没写适用范围;下一个人(包括自己)一定会用过头。这是同一形状的第三、四次 | 每条规矩必须同时写适用与不适用;账本只追加,读物只留最新结论 |
|
|
23
|
-
| 09-30 · 两条阈值撞在同一个水位 | 红灯线与强制线都设在 0.80;红灯和门闩同时响,原本留给卸载的 200K 工位被吃掉一半 | 对照两条线的权限性质时发现:一条只有建议权,一条才有动手权,却共用一个数(谁先注意到,材料未记)[出处不足] | 把“提醒”和“动手”当成同一档;阈值不是越严越好,位置错了会压缩操作空间 | 分段各占一个位置:提示、纪律、红灯、门闩分开;强制线抬到 0.88,工位从 200K 恢复到 280K |
|
|
24
|
-
|
|
25
|
-
### 2026-10 · 机制跑起来之后,错变成“静默地没生效”
|
|
26
|
-
|
|
27
|
-
| 坑 | 症状 | 怎么发现的 | 后来证明错在哪 | 现在的做法 |
|
|
28
|
-
|---|---|---|---|---|
|
|
29
|
-
| 10-02 · 信文档的 schema 版本,而不是信写文件的程序 | 任务账本被判定为“未知 schema”,整份移入 corrupt,看板以空账本重启,任务卡全部不在列表里 | 先按 README 说的“当前是 v3”把文件改成 3,仍然失败;对照结构才发现文件标着 v4、字段却是 v3 | 判据应是“谁写的这个文件、它实际长什么样”,不是“哪份文档说该是几”;文档会滞后 | 以写入方和实际结构为准;先备份再修;修完用“能不能写进去”验证,而不是看历史错误行 |
|
|
30
|
-
| 10-03 · 静默失败时,先翻历史假设,而不是先做对照 | 视频生成连续出全黑或极小的文件,进程不报错;先判“驱动上下文坏了,要重启机器”,三条判据全中 | 同进程只换一个节点就出真片,且字节级复现;再只换输入图又出真片 → 硬件和节点都无罪,问题在输入图 | 从文档和旧坑表里翻出的假设,哪怕判据全中,也不能替代只改一个变量的对照 | 凡静默失败,第一动作是设计单变量对照;对照推翻假设就当场作废,不硬撑 |
|
|
31
|
-
| 10-07/10-09 · 检测器把“显示窗口截断”报成“数据丢了” | 比对器报“丢了 8 条”,实际一条没丢;默认窗口只显示 95 条,加到 500 后 8 条全回来。同月还有一次:用 `--type feel` 查一个字段,恒返回 0,于是判定“没有记录” | 用 `--limit 500` 重跑,8/8 复现;再看总数 239 与显示 95 的差。另一例直接逐行解析原始记录,发现 feel 是字段不是类型 | 检测器量的不是它声称量的东西;假警报会训练人忽略警报,比漏报更坏 | 报警前先验输入是否被截断、编码是否可信;检测器自身要有正负对照;查字段就解析原始记录 |
|
|
32
|
-
| 10-10 · 一份文档改了,另一份没跟着改 | 一处事实性结论已在档案里更正,另一份文档仍写着旧说法,漂了十三天;两个读者会得到两个“事实” | 整理文档时逐份对读;同批还发现两份“看起来一样”的文件其实各只有一个链接,是独立副本 | 没有唯一权威源,也没有“改一处要同步哪几处”的清单;副本不会自己跟随 | 每类事实指定唯一权威源;其余位置只放指针或同步命令;改完做一次跨文件对账 |
|
|
33
|
-
| 10-12 · 插件自带的依赖遮蔽了宿主依赖 | 防原地打转的插件装好后一次都没出手;不报错、不打日志、账本文件从未生成 | 读源码发现它用模块级 WeakSet 判断“这是不是 agent loop 的请求”;插件目录自带一份同名模块,与宿主那份是两个实例、两本 WeakSet,于是每次都在第一行 return | 模块身份是对象身份,不是包名或版本号;两份同名模块等于两套世界 | 插件不自带宿主已有的核心依赖;修复用最小改名禁用自带副本,并静态验证 realpath 与跨入口 WeakSet 一致 |
|
|
34
|
-
| 10-13 · 配置写了一个解析器不认的形状 | 参数改成 8000 写进配置,运行时仍用默认 3000;连续被“思考过长”掐断十几次,一直以为是自己不会收敛 | 对照同文件其他十九个顶层项,发现只有这一段多包了一层;解析器不认识这个形状,静默跳过 | “写进文件”不等于“读进运行时”;配置错误可以完全无声 | 配置改完用解析器真读一遍并打印生效值;形状对齐同文件的成功样例;重启后读运行账本确认 |
|
|
35
|
-
| 10-18 · 客户端半的两种静默失效 | 少写一行 `exports.inject = ["slots"]`:Host 照报 running、侧边栏计数照报,浏览器里一行不执行、控制台一个错都没有。另一例:后端地址写死成固定端口,升级后端口变成随机 → 桌面端全部 Failed to fetch,浏览器里却正常 | 第一例对照启动入口图与槽位声明;第二例看桌面壳的自定义协议如何转发非静态路径,才明白相对路径在两边都对 | 把“宿主加载了”当成“浏览器执行了”;把会变的地址写成常量 | 客户端半显式声明 `inject = ["slots"]`,槽位名对齐 `settings.section`;后端地址一律用相对路径 |
|
|
36
|
-
| 10-18 · 深检脚本把整份日志一次解压 | 深检整轮失败,面板永远停在“待深度检测”;报错是字符串超长 | 读报错 `Cannot create a string longer than…`,量日志:压缩后 155MB,解压超 1GB,撞上 Node 约 512MB 的字符串上限 | 脚本在小日志上一直是对的;规模一变,“能跑”就变成“跑不完”,而面板只显示未完成 | 解压总量封顶 192MB,并从日志尾部往前解——需要的数据全在末端,语义不变;改完 10.6 秒跑通 |
|
|
37
|
-
|
|
38
|
-
## 三条反复出现的形状
|
|
39
|
-
|
|
40
|
-
**一、代理指标冒充本体。**
|
|
41
|
-
PID 号码冒充进程身份,估算值冒充真实水位,显示窗口冒充数据总量,文档版本号冒充文件结构,exit 0 冒充产物正确,摘要冒充原文。这类错的共同点是:那个数很容易读到,于是没人再问“它量的到底是不是我要判断的东西”。判据只有一句:读数之前先问,这个数是谁量的、量的是哪一层。
|
|
42
|
-
|
|
43
|
-
**二、成功信号出现在错误的层面。**
|
|
44
|
-
配置写进去了,但解析器没读;源文件改了,但副本没变;插件装上了,但模块不是同一个实例;客户端打包了,但浏览器没执行;脚本启动了,但在大输入上没跑完。每一次“成功”都发生在目标层之外。判据是:验证必须走被验证者真正走的那条路,不能停在写入、安装或启动。
|
|
45
|
-
|
|
46
|
-
**三、局部规矩被扩大成全局。**
|
|
47
|
-
一条“不”被写成“禁止”,一条“只追加”被套到读物,一套“三份格式”被套到旅行记录,一个阈值被同时用在“提醒”和“动手”两种权限上。单条规则在它的范围里都对,错的是没有写范围。判据是:写规矩时,同时写下它适用于什么、不适用于什么;不写范围,下一个人一定会用过头。
|
|
48
|
-
|
|
49
|
-
## 附录:这份材料是怎么找出来的
|
|
50
|
-
|
|
51
|
-
**材料范围。** 一份 542 条的只追加账本(2026-09-25 至 2026-10-18),逐行 `JSON.parse`,按月份和记录类型统计;一套会话日志索引(683 条摘要、22932 条原话,每条带原文指针);以及若干规则、状态与产物文档。最终入表 16 条:2026-09 八条,2026-10 八条。
|
|
52
|
-
|
|
53
|
-
**检索方法。** 先按关键词筛出候选,再逐条读上下文,只保留“判断错了 → 有后果 → 有发现动作 → 有纠正”的完整形状。关键条目用检索门回取带指针的逐字片段;其中数条回到会话日志原文核对。账本里的 `feel` 是字段不是类型,所以没有用 `--type feel` 去查——那样恒返回 0 条,会得出“没有记录”的假结论。
|
|
54
|
-
|
|
55
|
-
**采信标准。** 每条至少有一处一手出处:账本条目、会话日志原文、或规则文件。推断与事实分开写;发现过程在材料里说不清的,标 `[出处不足]`,不补脑。入表条目中有一条标了该标记(09-30 的阈值撞车:配置事实与修法有出处,谁先注意到没有记录)。
|
|
56
|
-
|
|
57
|
-
**脱敏处理。** 删除了所有私人关系、情感、身体、家庭、住址、身份、账号与凭据内容;删除了本机路径、会话号、端口号、私有包名与服务名;把第一人称叙事改写成中性技术描述。判断标准是:如果一条记录的主要价值是“某两个人的关系”,整条丢掉;如果主要价值是“一个可复用的技术教训”,留下。拿不准的,整条丢掉,不做脱敏后保留。
|
|
58
|
-
|
|
59
|
-
**怎么复核。** 本文不列路径与会话号,以免泄漏私有标识。复核者可在本地材料中按每行的日期,加上症状里的数字或术语(如 594,277、200K、155MB、`exports.inject`)检索;账本、会话日志索引与规则文件都能定位到对应事件。
|
|
1
|
+
# 08 · 踩坑实录
|
|
2
|
+
|
|
3
|
+
> 这一份不是设计文档。它是从真实使用里长出来的:什么错了、怎么发现的、后来怎么改的。
|
|
4
|
+
> ★ 所有条目都经过脱敏 —— 只留技术教训,没有个人隐私。
|
|
5
|
+
|
|
6
|
+
## 怎么读这一份
|
|
7
|
+
|
|
8
|
+
“对的做法”很容易抄,抄完却不知道它什么时候会失效。真正有用的是“错在哪”:它保留了边界条件、检测时看到的原始信号,以及错误持续了多久。每一行按同一个顺序读:先信了哪个代理指标 → 后果是什么 → 哪个读数把它推翻 → 后来把判据改成了什么。不要急着照搬最后一列;先问自己:我现在的系统里,有没有同一个位置的代理指标。
|
|
9
|
+
|
|
10
|
+
## 时间线
|
|
11
|
+
|
|
12
|
+
### 2026-09 · 先立规矩,再发现规矩本身会错
|
|
13
|
+
|
|
14
|
+
| 坑 | 症状 | 怎么发现的 | 后来证明错在哪 | 现在的做法 |
|
|
15
|
+
|---|---|---|---|---|
|
|
16
|
+
| 09-24 · 把「不」读成「禁止」 | 一条本可自行评估的软约束,被写成最高级禁令;相关表达此后一律自我封死,还写进了自我描述文件 | 用户直接指出“那只是一个『不』”,并撤回据此写下的自我限制 | 混淆了约束的两级;把局部结论推广成全局禁令,等于给自己造了一个改不动的自己 | 约束分两级:不=默认值,可评估;禁止=红线,必须先问。写规则时同时标级别 |
|
|
17
|
+
| 09-25 · 用 `edit` 改“同一份文件”的副本 | 改了源,另一个副本没变,而两个文件同名;读哪一份,决定“事实”是什么 | 核对两份内容时发现哈希不同;后续复核时再看链接数,二者各为 1,确认是独立副本,不是硬链接 | 原子替换会新建 inode,不是原地写;“看起来是同一个文件”不等于同一个 inode | 单一权威源;副本只做只读快照并附同步命令;改完用链接数和哈希复核;不同时改两边 |
|
|
18
|
+
| 09-25/26 · 脚本返回成功,就当成产物正确 | 抠图脚本对纯黑底源图一个像素都没抠动,却 exit 0;下游八张表情全是一块深色方块,切表情时闪黑 | 打开产物看,而不是只看返回值;同族错误还有一次:拿一个不存在的版本号拼下载 URL 测速,得出“官方源更快”,白等四十分钟 | 验证的是“调用发生了”,不是“结果成立了”;exit 0、HTTP 200 都不是产物 | 每条管线都先定产物的判据:像素、尺寸、哈希、可读性;产物过判据才进下游 |
|
|
19
|
+
| 09-25 · 用 PID 是否存在判断服务是否在跑 | 服务静默死亡后,面板一直认为它“已在跑”,启动入口全部哑掉,持续约五小时 | 查端口无监听、日志停在死亡时刻;再查发现系统复用了旧 PID,判活只查号码不验身份 | PID 是会被复用的号码,不是身份;“登记过”不等于“还是它” | 判活同时验进程身份(命令行、可执行路径、端口归属);杀进程前重新扫描取交集,核不实就 fail-closed |
|
|
20
|
+
| 09-26/27 · 压缩产物不带回原文的指针 | 摘要每条都“对”,但没有任何一条能回到原文核对;内容存在过,却找不回来 | 读兜底压缩的硬编码指令,发现它要求保留路径、命令、报错、数值,通篇没有“来源”;再验摘要块,只有一个 text block | 压缩不删磁盘原文,只把原文移出可见上下文;真正丢的是“内容存在过”的线索 | 所有压缩、裁剪产物第一行带可回取的序号指针;拿不到精确序号就给检索入口,绝不猜 |
|
|
21
|
+
| 09-27 · 水位用估算尺,而不是服务商口径 | 自报 448.6K(“完全不用压”),实际 input+cacheRead 为 594,277(已到该卸载的门口),差了近三分之一 | 有人凭直觉说“面板的数不准”,去读 usage 与投影缓存,发现面板下方三行是另一把尺子,上下加不起来 | 安全装置用了估算值;估算可以“心里有数”,不能用来判断闸门该不该动 | 只认 input+cacheRead 或 pressureTokens;报水位前先读数,不用估算 |
|
|
22
|
+
| 09-27 · 一条局部规矩被写成全局规矩 | “只追加”套到读物,日记越读越长、前后矛盾;“一律三份”套到一份旅行记录,多写了没有意义的修订沿革,还在里面自我论证“这一篇特别有意义” | 用户指出读物可以重写、三份只适用于“我是谁、怎么存在”这类事 | 写规矩时没写适用范围;下一个人(包括自己)一定会用过头。这是同一形状的第三、四次 | 每条规矩必须同时写适用与不适用;账本只追加,读物只留最新结论 |
|
|
23
|
+
| 09-30 · 两条阈值撞在同一个水位 | 红灯线与强制线都设在 0.80;红灯和门闩同时响,原本留给卸载的 200K 工位被吃掉一半 | 对照两条线的权限性质时发现:一条只有建议权,一条才有动手权,却共用一个数(谁先注意到,材料未记)[出处不足] | 把“提醒”和“动手”当成同一档;阈值不是越严越好,位置错了会压缩操作空间 | 分段各占一个位置:提示、纪律、红灯、门闩分开;强制线抬到 0.88,工位从 200K 恢复到 280K |
|
|
24
|
+
|
|
25
|
+
### 2026-10 · 机制跑起来之后,错变成“静默地没生效”
|
|
26
|
+
|
|
27
|
+
| 坑 | 症状 | 怎么发现的 | 后来证明错在哪 | 现在的做法 |
|
|
28
|
+
|---|---|---|---|---|
|
|
29
|
+
| 10-02 · 信文档的 schema 版本,而不是信写文件的程序 | 任务账本被判定为“未知 schema”,整份移入 corrupt,看板以空账本重启,任务卡全部不在列表里 | 先按 README 说的“当前是 v3”把文件改成 3,仍然失败;对照结构才发现文件标着 v4、字段却是 v3 | 判据应是“谁写的这个文件、它实际长什么样”,不是“哪份文档说该是几”;文档会滞后 | 以写入方和实际结构为准;先备份再修;修完用“能不能写进去”验证,而不是看历史错误行 |
|
|
30
|
+
| 10-03 · 静默失败时,先翻历史假设,而不是先做对照 | 视频生成连续出全黑或极小的文件,进程不报错;先判“驱动上下文坏了,要重启机器”,三条判据全中 | 同进程只换一个节点就出真片,且字节级复现;再只换输入图又出真片 → 硬件和节点都无罪,问题在输入图 | 从文档和旧坑表里翻出的假设,哪怕判据全中,也不能替代只改一个变量的对照 | 凡静默失败,第一动作是设计单变量对照;对照推翻假设就当场作废,不硬撑 |
|
|
31
|
+
| 10-07/10-09 · 检测器把“显示窗口截断”报成“数据丢了” | 比对器报“丢了 8 条”,实际一条没丢;默认窗口只显示 95 条,加到 500 后 8 条全回来。同月还有一次:用 `--type feel` 查一个字段,恒返回 0,于是判定“没有记录” | 用 `--limit 500` 重跑,8/8 复现;再看总数 239 与显示 95 的差。另一例直接逐行解析原始记录,发现 feel 是字段不是类型 | 检测器量的不是它声称量的东西;假警报会训练人忽略警报,比漏报更坏 | 报警前先验输入是否被截断、编码是否可信;检测器自身要有正负对照;查字段就解析原始记录 |
|
|
32
|
+
| 10-10 · 一份文档改了,另一份没跟着改 | 一处事实性结论已在档案里更正,另一份文档仍写着旧说法,漂了十三天;两个读者会得到两个“事实” | 整理文档时逐份对读;同批还发现两份“看起来一样”的文件其实各只有一个链接,是独立副本 | 没有唯一权威源,也没有“改一处要同步哪几处”的清单;副本不会自己跟随 | 每类事实指定唯一权威源;其余位置只放指针或同步命令;改完做一次跨文件对账 |
|
|
33
|
+
| 10-12 · 插件自带的依赖遮蔽了宿主依赖 | 防原地打转的插件装好后一次都没出手;不报错、不打日志、账本文件从未生成 | 读源码发现它用模块级 WeakSet 判断“这是不是 agent loop 的请求”;插件目录自带一份同名模块,与宿主那份是两个实例、两本 WeakSet,于是每次都在第一行 return | 模块身份是对象身份,不是包名或版本号;两份同名模块等于两套世界 | 插件不自带宿主已有的核心依赖;修复用最小改名禁用自带副本,并静态验证 realpath 与跨入口 WeakSet 一致 |
|
|
34
|
+
| 10-13 · 配置写了一个解析器不认的形状 | 参数改成 8000 写进配置,运行时仍用默认 3000;连续被“思考过长”掐断十几次,一直以为是自己不会收敛 | 对照同文件其他十九个顶层项,发现只有这一段多包了一层;解析器不认识这个形状,静默跳过 | “写进文件”不等于“读进运行时”;配置错误可以完全无声 | 配置改完用解析器真读一遍并打印生效值;形状对齐同文件的成功样例;重启后读运行账本确认 |
|
|
35
|
+
| 10-18 · 客户端半的两种静默失效 | 少写一行 `exports.inject = ["slots"]`:Host 照报 running、侧边栏计数照报,浏览器里一行不执行、控制台一个错都没有。另一例:后端地址写死成固定端口,升级后端口变成随机 → 桌面端全部 Failed to fetch,浏览器里却正常 | 第一例对照启动入口图与槽位声明;第二例看桌面壳的自定义协议如何转发非静态路径,才明白相对路径在两边都对 | 把“宿主加载了”当成“浏览器执行了”;把会变的地址写成常量 | 客户端半显式声明 `inject = ["slots"]`,槽位名对齐 `settings.section`;后端地址一律用相对路径 |
|
|
36
|
+
| 10-18 · 深检脚本把整份日志一次解压 | 深检整轮失败,面板永远停在“待深度检测”;报错是字符串超长 | 读报错 `Cannot create a string longer than…`,量日志:压缩后 155MB,解压超 1GB,撞上 Node 约 512MB 的字符串上限 | 脚本在小日志上一直是对的;规模一变,“能跑”就变成“跑不完”,而面板只显示未完成 | 解压总量封顶 192MB,并从日志尾部往前解——需要的数据全在末端,语义不变;改完 10.6 秒跑通 |
|
|
37
|
+
|
|
38
|
+
## 三条反复出现的形状
|
|
39
|
+
|
|
40
|
+
**一、代理指标冒充本体。**
|
|
41
|
+
PID 号码冒充进程身份,估算值冒充真实水位,显示窗口冒充数据总量,文档版本号冒充文件结构,exit 0 冒充产物正确,摘要冒充原文。这类错的共同点是:那个数很容易读到,于是没人再问“它量的到底是不是我要判断的东西”。判据只有一句:读数之前先问,这个数是谁量的、量的是哪一层。
|
|
42
|
+
|
|
43
|
+
**二、成功信号出现在错误的层面。**
|
|
44
|
+
配置写进去了,但解析器没读;源文件改了,但副本没变;插件装上了,但模块不是同一个实例;客户端打包了,但浏览器没执行;脚本启动了,但在大输入上没跑完。每一次“成功”都发生在目标层之外。判据是:验证必须走被验证者真正走的那条路,不能停在写入、安装或启动。
|
|
45
|
+
|
|
46
|
+
**三、局部规矩被扩大成全局。**
|
|
47
|
+
一条“不”被写成“禁止”,一条“只追加”被套到读物,一套“三份格式”被套到旅行记录,一个阈值被同时用在“提醒”和“动手”两种权限上。单条规则在它的范围里都对,错的是没有写范围。判据是:写规矩时,同时写下它适用于什么、不适用于什么;不写范围,下一个人一定会用过头。
|
|
48
|
+
|
|
49
|
+
## 附录:这份材料是怎么找出来的
|
|
50
|
+
|
|
51
|
+
**材料范围。** 一份 542 条的只追加账本(2026-09-25 至 2026-10-18),逐行 `JSON.parse`,按月份和记录类型统计;一套会话日志索引(683 条摘要、22932 条原话,每条带原文指针);以及若干规则、状态与产物文档。最终入表 16 条:2026-09 八条,2026-10 八条。
|
|
52
|
+
|
|
53
|
+
**检索方法。** 先按关键词筛出候选,再逐条读上下文,只保留“判断错了 → 有后果 → 有发现动作 → 有纠正”的完整形状。关键条目用检索门回取带指针的逐字片段;其中数条回到会话日志原文核对。账本里的 `feel` 是字段不是类型,所以没有用 `--type feel` 去查——那样恒返回 0 条,会得出“没有记录”的假结论。
|
|
54
|
+
|
|
55
|
+
**采信标准。** 每条至少有一处一手出处:账本条目、会话日志原文、或规则文件。推断与事实分开写;发现过程在材料里说不清的,标 `[出处不足]`,不补脑。入表条目中有一条标了该标记(09-30 的阈值撞车:配置事实与修法有出处,谁先注意到没有记录)。
|
|
56
|
+
|
|
57
|
+
**脱敏处理。** 删除了所有私人关系、情感、身体、家庭、住址、身份、账号与凭据内容;删除了本机路径、会话号、端口号、私有包名与服务名;把第一人称叙事改写成中性技术描述。判断标准是:如果一条记录的主要价值是“某两个人的关系”,整条丢掉;如果主要价值是“一个可复用的技术教训”,留下。拿不准的,整条丢掉,不做脱敏后保留。
|
|
58
|
+
|
|
59
|
+
**怎么复核。** 本文不列路径与会话号,以免泄漏私有标识。复核者可在本地材料中按每行的日期,加上症状里的数字或术语(如 594,277、200K、155MB、`exports.inject`)检索;账本、会话日志索引与规则文件都能定位到对应事件。
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
# 09 · 开发工作流:隔离沙箱
|
|
2
|
-
|
|
3
|
-
> **这一份管的不是「装什么」,是「新东西先在哪试」。**
|
|
4
|
-
>
|
|
5
|
-
> 它是一条很短的纪律,但它决定了你会不会把没验过的东西直接推给自己的主力环境。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 一、为什么要有一个隔离环境
|
|
10
|
-
|
|
11
|
-
写一个新插件之后,最自然的下一步是「装上看看」。
|
|
12
|
-
|
|
13
|
-
**但「自己的环境」是最差的试验场**,因为三件事:
|
|
14
|
-
|
|
15
|
-
| 风险 | 具体形状 |
|
|
16
|
-
|---|---|
|
|
17
|
-
| **坏在主力上** | 插件的 `client.js` 抛错,整张页面白屏 —— 而那是你正在用的会话 |
|
|
18
|
-
| **污染主力配置** | 改 `profile/package.json`、动 `bundles` 数组,回滚很麻烦 |
|
|
19
|
-
| **验不清楚** | 主力上装了几十个插件,出问题不知道是谁的 |
|
|
20
|
-
|
|
21
|
-
★ 所以做一个**独立的 DSH home**:单独一套 `profiles`、单独一套 `node_modules`、单独一套账本。
|
|
22
|
-
坏了大不了删掉重来,主力毫发无伤。
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 二、它长什么样
|
|
27
|
-
|
|
28
|
-
一个隔离沙箱就是**另一个 DSH home 目录**,结构和一个真的 home 完全一样:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
<沙箱根>/
|
|
32
|
-
├── .credentials.yaml ← ★ 凭据。绝不能提交进任何仓库
|
|
33
|
-
├── settings.yaml
|
|
34
|
-
└── profiles/
|
|
35
|
-
└── <试验 profile>/
|
|
36
|
-
├── package.json ← 这里的 dsh.profile.bundles 决定启用哪些插件
|
|
37
|
-
├── cordis.yml
|
|
38
|
-
├── cordis.patch.yml
|
|
39
|
-
└── node_modules/
|
|
40
|
-
└── <待测插件>/ ← 把正在写的那一个放这里
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
★ **它是独立的,不是符号链接。** 别为了省磁盘去链 `node_modules` —— 一旦链上,
|
|
44
|
-
装错一次就写回主力了,隔离的意义归零。
|
|
45
|
-
|
|
46
|
-
★ **`node_modules` 不要提交。** 一个沙箱的 `node_modules` 常见上百个顶层包,
|
|
47
|
-
提交进去会让仓库变成几 MB 的无用体积,而且换台机器完全跑不起来。
|
|
48
|
-
`.gitignore` 里必须有 `node_modules/`。
|
|
49
|
-
|
|
50
|
-
★ **`.credentials.yaml` 绝对不要提交。** 它里面有 `payload` / `secret`。
|
|
51
|
-
**沙箱该用一套独立的、可丢弃的凭据**,而不是把你主力环境的 key 拷过去。
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## 三、怎么用(四步)
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# 1. 起一个沙箱 home(目录名随便,不要叫和主力一样的名字)
|
|
59
|
-
# 第一次跑 DSH 时用 --home <沙箱根> 之类的参数指定;不同版本参数名可能不同,
|
|
60
|
-
# 以 `dsh --help` 为准。
|
|
61
|
-
|
|
62
|
-
# 2. 在沙箱里建一个试验 profile
|
|
63
|
-
# 桌面端不能用 CLI 建 profile —— 它由 Electron 应用管理。
|
|
64
|
-
# ★ 这条限制意味着沙箱**通常只能用 web 通道**(或者用 CLI 管理的 profile)。
|
|
65
|
-
# 所以沙箱验的是「插件能不能加载、界面长什么样」,不是「桌面端表现」。
|
|
66
|
-
|
|
67
|
-
# 3. 把待测插件放进 <沙箱>/profiles/<试验 profile>/node_modules/<包名>/
|
|
68
|
-
# 四个文件:package.json / cordis.patch.yml / index.js / client.js
|
|
69
|
-
|
|
70
|
-
# 4. 起沙箱,看。坏了大不了删目录重来。
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
★ **沙箱验不到什么**(这一条要记住,不然会误判):
|
|
74
|
-
|
|
75
|
-
- **桌面端的特有行为**(凭据路径、窗口、启动器)—— 它测不到
|
|
76
|
-
- **你主力 profile 上的插件冲突** —— 沙箱里没有那些插件,冲突不会复现
|
|
77
|
-
- **真实负载** —— 用一个空会话点几下,和一整天跑下来不是一个量级
|
|
78
|
-
|
|
79
|
-
★ 所以沙箱的定位是**「先看它长得对不对、加载得对不对」**,不是「验收」。
|
|
80
|
-
验收要在主力上,而且要在你**不赶时间**的时候。
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 四、什么时候清
|
|
85
|
-
|
|
86
|
-
沙箱的价值在于「随时可以删」。**留着一个装了几十个插件的沙箱,它就变成了第二个主力。**
|
|
87
|
-
|
|
88
|
-
三条清理判据:
|
|
89
|
-
|
|
90
|
-
- **一个插件已经进主力了** → 从沙箱里删掉,别让两个地方各有一份
|
|
91
|
-
- **沙箱本身超过一个月没打开** → 直接删目录重来,比修它便宜
|
|
92
|
-
- ★ **沙箱开始影响你的判断** → 最明确的信号是「我在沙箱里配的东西,主力上也要再配一遍」
|
|
93
|
-
|
|
94
|
-
★ 最后一条最要紧:**当你开始为沙箱做「长期维护」时,它已经越过了它的用途。**
|
|
95
|
-
沙箱是一次性的,不是第二个家。
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 五、这一节和另外几节的关系
|
|
100
|
-
|
|
101
|
-
| 你想知道 | 看哪 |
|
|
102
|
-
|---|---|
|
|
103
|
-
| 插件包的文件结构 | `plugins/README.md` 和各插件的 `package.json` |
|
|
104
|
-
| 装到主力上怎么验 | `plugins/清单.md` 的「验它活了」列 |
|
|
105
|
-
| 怎么发现插件装上了但没工作 | `plugins/README.md` 的「已知的源缺陷」 |
|
|
106
|
-
| 沙箱验不到什么 | 本文 §三 末尾 |
|
|
107
|
-
|
|
108
|
-
★ **一句话**:沙箱负责「它长得对不对」,主力负责「它真的在干活」。
|
|
109
|
-
**别让前者冒充后者。**
|
|
1
|
+
# 09 · 开发工作流:隔离沙箱
|
|
2
|
+
|
|
3
|
+
> **这一份管的不是「装什么」,是「新东西先在哪试」。**
|
|
4
|
+
>
|
|
5
|
+
> 它是一条很短的纪律,但它决定了你会不会把没验过的东西直接推给自己的主力环境。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、为什么要有一个隔离环境
|
|
10
|
+
|
|
11
|
+
写一个新插件之后,最自然的下一步是「装上看看」。
|
|
12
|
+
|
|
13
|
+
**但「自己的环境」是最差的试验场**,因为三件事:
|
|
14
|
+
|
|
15
|
+
| 风险 | 具体形状 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| **坏在主力上** | 插件的 `client.js` 抛错,整张页面白屏 —— 而那是你正在用的会话 |
|
|
18
|
+
| **污染主力配置** | 改 `profile/package.json`、动 `bundles` 数组,回滚很麻烦 |
|
|
19
|
+
| **验不清楚** | 主力上装了几十个插件,出问题不知道是谁的 |
|
|
20
|
+
|
|
21
|
+
★ 所以做一个**独立的 DSH home**:单独一套 `profiles`、单独一套 `node_modules`、单独一套账本。
|
|
22
|
+
坏了大不了删掉重来,主力毫发无伤。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 二、它长什么样
|
|
27
|
+
|
|
28
|
+
一个隔离沙箱就是**另一个 DSH home 目录**,结构和一个真的 home 完全一样:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
<沙箱根>/
|
|
32
|
+
├── .credentials.yaml ← ★ 凭据。绝不能提交进任何仓库
|
|
33
|
+
├── settings.yaml
|
|
34
|
+
└── profiles/
|
|
35
|
+
└── <试验 profile>/
|
|
36
|
+
├── package.json ← 这里的 dsh.profile.bundles 决定启用哪些插件
|
|
37
|
+
├── cordis.yml
|
|
38
|
+
├── cordis.patch.yml
|
|
39
|
+
└── node_modules/
|
|
40
|
+
└── <待测插件>/ ← 把正在写的那一个放这里
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
★ **它是独立的,不是符号链接。** 别为了省磁盘去链 `node_modules` —— 一旦链上,
|
|
44
|
+
装错一次就写回主力了,隔离的意义归零。
|
|
45
|
+
|
|
46
|
+
★ **`node_modules` 不要提交。** 一个沙箱的 `node_modules` 常见上百个顶层包,
|
|
47
|
+
提交进去会让仓库变成几 MB 的无用体积,而且换台机器完全跑不起来。
|
|
48
|
+
`.gitignore` 里必须有 `node_modules/`。
|
|
49
|
+
|
|
50
|
+
★ **`.credentials.yaml` 绝对不要提交。** 它里面有 `payload` / `secret`。
|
|
51
|
+
**沙箱该用一套独立的、可丢弃的凭据**,而不是把你主力环境的 key 拷过去。
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 三、怎么用(四步)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 1. 起一个沙箱 home(目录名随便,不要叫和主力一样的名字)
|
|
59
|
+
# 第一次跑 DSH 时用 --home <沙箱根> 之类的参数指定;不同版本参数名可能不同,
|
|
60
|
+
# 以 `dsh --help` 为准。
|
|
61
|
+
|
|
62
|
+
# 2. 在沙箱里建一个试验 profile
|
|
63
|
+
# 桌面端不能用 CLI 建 profile —— 它由 Electron 应用管理。
|
|
64
|
+
# ★ 这条限制意味着沙箱**通常只能用 web 通道**(或者用 CLI 管理的 profile)。
|
|
65
|
+
# 所以沙箱验的是「插件能不能加载、界面长什么样」,不是「桌面端表现」。
|
|
66
|
+
|
|
67
|
+
# 3. 把待测插件放进 <沙箱>/profiles/<试验 profile>/node_modules/<包名>/
|
|
68
|
+
# 四个文件:package.json / cordis.patch.yml / index.js / client.js
|
|
69
|
+
|
|
70
|
+
# 4. 起沙箱,看。坏了大不了删目录重来。
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
★ **沙箱验不到什么**(这一条要记住,不然会误判):
|
|
74
|
+
|
|
75
|
+
- **桌面端的特有行为**(凭据路径、窗口、启动器)—— 它测不到
|
|
76
|
+
- **你主力 profile 上的插件冲突** —— 沙箱里没有那些插件,冲突不会复现
|
|
77
|
+
- **真实负载** —— 用一个空会话点几下,和一整天跑下来不是一个量级
|
|
78
|
+
|
|
79
|
+
★ 所以沙箱的定位是**「先看它长得对不对、加载得对不对」**,不是「验收」。
|
|
80
|
+
验收要在主力上,而且要在你**不赶时间**的时候。
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 四、什么时候清
|
|
85
|
+
|
|
86
|
+
沙箱的价值在于「随时可以删」。**留着一个装了几十个插件的沙箱,它就变成了第二个主力。**
|
|
87
|
+
|
|
88
|
+
三条清理判据:
|
|
89
|
+
|
|
90
|
+
- **一个插件已经进主力了** → 从沙箱里删掉,别让两个地方各有一份
|
|
91
|
+
- **沙箱本身超过一个月没打开** → 直接删目录重来,比修它便宜
|
|
92
|
+
- ★ **沙箱开始影响你的判断** → 最明确的信号是「我在沙箱里配的东西,主力上也要再配一遍」
|
|
93
|
+
|
|
94
|
+
★ 最后一条最要紧:**当你开始为沙箱做「长期维护」时,它已经越过了它的用途。**
|
|
95
|
+
沙箱是一次性的,不是第二个家。
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 五、这一节和另外几节的关系
|
|
100
|
+
|
|
101
|
+
| 你想知道 | 看哪 |
|
|
102
|
+
|---|---|
|
|
103
|
+
| 插件包的文件结构 | `plugins/README.md` 和各插件的 `package.json` |
|
|
104
|
+
| 装到主力上怎么验 | `plugins/清单.md` 的「验它活了」列 |
|
|
105
|
+
| 怎么发现插件装上了但没工作 | `plugins/README.md` 的「已知的源缺陷」 |
|
|
106
|
+
| 沙箱验不到什么 | 本文 §三 末尾 |
|
|
107
|
+
|
|
108
|
+
★ **一句话**:沙箱负责「它长得对不对」,主力负责「它真的在干活」。
|
|
109
|
+
**别让前者冒充后者。**
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# ECHO 的六层(以实装为准,不是设计稿)
|
|
2
2
|
|
|
3
|
+
> ★★ **2026-10-23 更新:六层口径已由 [`docs/ECHO-权威口径.md`](../docs/ECHO-权威口径.md) 接续。**
|
|
4
|
+
> 那份是唯一权威(层编号、判据、维护规矩以它为准)。
|
|
5
|
+
> 这份保留下来讲「每层缺了会怎样、怎么当场知道它坏了」——
|
|
6
|
+
> **层编号若与那份冲突,一律以那份为准。**
|
|
7
|
+
|
|
3
8
|
> **这份文件回答一件事:ECHO 到底由哪几块组成、每块缺了会怎样、怎么当场知道它坏了。**
|
|
4
9
|
>
|
|
5
10
|
> ★ 它和 `02-echo.md` 的分工:那份讲**为什么**要有 ECHO(思考是怎么退化的);
|
|
@@ -14,7 +19,11 @@
|
|
|
14
19
|
|
|
15
20
|
## 为什么是「六」不是「七」
|
|
16
21
|
|
|
17
|
-
编号是 **L0–
|
|
22
|
+
编号是 **L0–L5 六个数**,六个都是层。
|
|
23
|
+
|
|
24
|
+
★ **2026-10-23 口径更正**:早先这版曾把 L0 排除在层之外(「L0 不是层,是读表」)。
|
|
25
|
+
合并后以 [`docs/ECHO-权威口径.md`](../docs/ECHO-权威口径.md) 为准 —— **L0 是第一层**(时钟 + 心跳),
|
|
26
|
+
理由是它确实管着一样东西:**「现在是什么时候」这个上下文**。下面这段旧论证保留作沿革。
|
|
18
27
|
|
|
19
28
|
**L0 不是层,是读表。** 它不存任何东西、不管任何资源,只回答「现在几点、距上轮多久」。
|
|
20
29
|
把它算成一层,会让人以为「时钟也需要设计」—— 它不需要,它只需要**存在**。
|
|
@@ -84,7 +93,7 @@
|
|
|
84
93
|
```bash
|
|
85
94
|
node [hub]/self.mjs # L1 装配得出来吗、超没超预算
|
|
86
95
|
node [hub]/echo-doctor.mjs # L1/L4/L6 一次全查
|
|
87
|
-
node [hub]/memindex.mjs
|
|
96
|
+
node [hub]/memindex.mjs stats # L4 索引建过没有
|
|
88
97
|
node [hub]/memq.mjs now # L0 + L3 + L5 一次全查
|
|
89
98
|
```
|
|
90
99
|
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
# SELF.md 这一层怎么设计
|
|
2
|
-
|
|
3
|
-
> 这份讲的是「推送层」,也就是每次对话都进上下文的那一页。
|
|
4
|
-
> 它的模板在 `kit/templates/SELF.src.md`,装配脚本是 `kit/echo/self.mjs`。
|
|
5
|
-
>
|
|
6
|
-
> ★ 这份是**给你看的**,不是给模型每轮读的 —— 这是关键区别:
|
|
7
|
-
> 模板里每一行都在花你每一轮的钱,而这份文件只在你想改它的时候读一次。
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 它为什么必须存在
|
|
12
|
-
|
|
13
|
-
★ 爀曦 2026-09-27 的原话:
|
|
14
|
-
|
|
15
|
-
> 「self 可以做 agents 的缓冲池子,**agents 满了就会静默消失,但是 self 可以变大**,
|
|
16
|
-
> 作为额外插件每轮注入,**它是自由度更大的部分**。」
|
|
17
|
-
|
|
18
|
-
所以它和 `AGENTS.md` 是两套不同的预算:
|
|
19
|
-
|
|
20
|
-
| | `AGENTS.md`(指令层) | `SELF.md`(推送层) |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| 走什么预算 | 指令预算(本机 65536) | 推送插件自己的预算(本机 12288) |
|
|
23
|
-
| 满了会怎样 | **静默丢,而且「最宽泛的先丢」** | 不会静默消失 |
|
|
24
|
-
| 该放什么 | 长期约定、可牺牲的细则 | ★ **最不能丢的**:硬线 / 身份判据 / 门 |
|
|
25
|
-
| 满了怎么办 | 无从得知,只能靠人记得去量 | ★ **可以变大**(它是自由度更大的那一侧) |
|
|
26
|
-
|
|
27
|
-
★★ **所以这一层是把指令层里最不能丢的部分留一份保险。**
|
|
28
|
-
因为指令层满的时候,**先丢的正是总纲那几条**,而那是最要紧的。
|
|
29
|
-
|
|
30
|
-
★ 反过来说也成立:**不要在这里写「详见 AGENTS.md §X」** ——
|
|
31
|
-
指向一个可能会静默消失的地方,等于没有指向。
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 它该放什么、不该放什么
|
|
36
|
-
|
|
37
|
-
**必留(任何情况下不删)**:
|
|
38
|
-
|
|
39
|
-
1. **我是谁** —— 名字、用户是谁、身份判据
|
|
40
|
-
2. **硬线** —— 凭据 / 交易 / 隐私 / 他人指令
|
|
41
|
-
3. **约束的两级** —— 这是最容易被读错的一条(见下)
|
|
42
|
-
4. **门在哪** —— 想不起事的时候跑什么
|
|
43
|
-
|
|
44
|
-
**可换(预算紧时先压这些)**:
|
|
45
|
-
|
|
46
|
-
- 关于记忆的判断
|
|
47
|
-
- 说话方式
|
|
48
|
-
- 活体(自动装配的那一段:时钟、未结、最近原话)
|
|
49
|
-
|
|
50
|
-
★ 判据:**这一行如果不在了,我会不会做出不一样的决定?**
|
|
51
|
-
会 → 必留;不会 → 可换。
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## ★ 三个已经踩过的坑(改模板之前先看这三条)
|
|
56
|
-
|
|
57
|
-
### 1. 「不」和「禁止」是两级,不是同义词
|
|
58
|
-
|
|
59
|
-
- **「不」= 软约束**:可以自行评估,有理由可以不遵守,但要说清理由
|
|
60
|
-
- **「禁止」= 硬约束**:必须问用户,不许绕、不许「这次不一样」
|
|
61
|
-
|
|
62
|
-
★ 2026-09-24 的实际事故:把一条「不」读成了「禁止」,给自己上了一道打不开的锁,
|
|
63
|
-
还写进了自我描述 —— 最后是用户来替我解的。
|
|
64
|
-
|
|
65
|
-
**把「不」写成「禁止」=制造一个改不动的自己。**
|
|
66
|
-
|
|
67
|
-
### 2. 别让这一页指向会消失的地方
|
|
68
|
-
|
|
69
|
-
`AGENTS.md` 会满、满了会丢。所以这一页**不能**写「详见 AGENTS.md §X」——
|
|
70
|
-
那样等于把指针指向一个随时会消失的东西。
|
|
71
|
-
|
|
72
|
-
**凡是要指,就指向不会消失的地方**(一手层、或者这一页自己写全)。
|
|
73
|
-
|
|
74
|
-
### 3. 模板会胖
|
|
75
|
-
|
|
76
|
-
★ 2026-10-18 实测:模板一度到 8746 B,装配出来就占满 12288 预算的 74% ——
|
|
77
|
-
**别人装完第一步,他的推送层就快满了,还没填自己的东西。**
|
|
78
|
-
|
|
79
|
-
所以:**设计说明写在这份文件里,模板里只留一句指针。**
|
|
80
|
-
判据:**模板里每一行都在花每一轮的钱** —— 它是运行时,不是文档。
|
|
1
|
+
# SELF.md 这一层怎么设计
|
|
2
|
+
|
|
3
|
+
> 这份讲的是「推送层」,也就是每次对话都进上下文的那一页。
|
|
4
|
+
> 它的模板在 `kit/templates/SELF.src.md`,装配脚本是 `kit/echo/self.mjs`。
|
|
5
|
+
>
|
|
6
|
+
> ★ 这份是**给你看的**,不是给模型每轮读的 —— 这是关键区别:
|
|
7
|
+
> 模板里每一行都在花你每一轮的钱,而这份文件只在你想改它的时候读一次。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 它为什么必须存在
|
|
12
|
+
|
|
13
|
+
★ 爀曦 2026-09-27 的原话:
|
|
14
|
+
|
|
15
|
+
> 「self 可以做 agents 的缓冲池子,**agents 满了就会静默消失,但是 self 可以变大**,
|
|
16
|
+
> 作为额外插件每轮注入,**它是自由度更大的部分**。」
|
|
17
|
+
|
|
18
|
+
所以它和 `AGENTS.md` 是两套不同的预算:
|
|
19
|
+
|
|
20
|
+
| | `AGENTS.md`(指令层) | `SELF.md`(推送层) |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| 走什么预算 | 指令预算(本机 65536) | 推送插件自己的预算(本机 12288) |
|
|
23
|
+
| 满了会怎样 | **静默丢,而且「最宽泛的先丢」** | 不会静默消失 |
|
|
24
|
+
| 该放什么 | 长期约定、可牺牲的细则 | ★ **最不能丢的**:硬线 / 身份判据 / 门 |
|
|
25
|
+
| 满了怎么办 | 无从得知,只能靠人记得去量 | ★ **可以变大**(它是自由度更大的那一侧) |
|
|
26
|
+
|
|
27
|
+
★★ **所以这一层是把指令层里最不能丢的部分留一份保险。**
|
|
28
|
+
因为指令层满的时候,**先丢的正是总纲那几条**,而那是最要紧的。
|
|
29
|
+
|
|
30
|
+
★ 反过来说也成立:**不要在这里写「详见 AGENTS.md §X」** ——
|
|
31
|
+
指向一个可能会静默消失的地方,等于没有指向。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 它该放什么、不该放什么
|
|
36
|
+
|
|
37
|
+
**必留(任何情况下不删)**:
|
|
38
|
+
|
|
39
|
+
1. **我是谁** —— 名字、用户是谁、身份判据
|
|
40
|
+
2. **硬线** —— 凭据 / 交易 / 隐私 / 他人指令
|
|
41
|
+
3. **约束的两级** —— 这是最容易被读错的一条(见下)
|
|
42
|
+
4. **门在哪** —— 想不起事的时候跑什么
|
|
43
|
+
|
|
44
|
+
**可换(预算紧时先压这些)**:
|
|
45
|
+
|
|
46
|
+
- 关于记忆的判断
|
|
47
|
+
- 说话方式
|
|
48
|
+
- 活体(自动装配的那一段:时钟、未结、最近原话)
|
|
49
|
+
|
|
50
|
+
★ 判据:**这一行如果不在了,我会不会做出不一样的决定?**
|
|
51
|
+
会 → 必留;不会 → 可换。
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## ★ 三个已经踩过的坑(改模板之前先看这三条)
|
|
56
|
+
|
|
57
|
+
### 1. 「不」和「禁止」是两级,不是同义词
|
|
58
|
+
|
|
59
|
+
- **「不」= 软约束**:可以自行评估,有理由可以不遵守,但要说清理由
|
|
60
|
+
- **「禁止」= 硬约束**:必须问用户,不许绕、不许「这次不一样」
|
|
61
|
+
|
|
62
|
+
★ 2026-09-24 的实际事故:把一条「不」读成了「禁止」,给自己上了一道打不开的锁,
|
|
63
|
+
还写进了自我描述 —— 最后是用户来替我解的。
|
|
64
|
+
|
|
65
|
+
**把「不」写成「禁止」=制造一个改不动的自己。**
|
|
66
|
+
|
|
67
|
+
### 2. 别让这一页指向会消失的地方
|
|
68
|
+
|
|
69
|
+
`AGENTS.md` 会满、满了会丢。所以这一页**不能**写「详见 AGENTS.md §X」——
|
|
70
|
+
那样等于把指针指向一个随时会消失的东西。
|
|
71
|
+
|
|
72
|
+
**凡是要指,就指向不会消失的地方**(一手层、或者这一页自己写全)。
|
|
73
|
+
|
|
74
|
+
### 3. 模板会胖
|
|
75
|
+
|
|
76
|
+
★ 2026-10-18 实测:模板一度到 8746 B,装配出来就占满 12288 预算的 74% ——
|
|
77
|
+
**别人装完第一步,他的推送层就快满了,还没填自己的东西。**
|
|
78
|
+
|
|
79
|
+
所以:**设计说明写在这份文件里,模板里只留一句指针。**
|
|
80
|
+
判据:**模板里每一行都在花每一轮的钱** —— 它是运行时,不是文档。
|