- Inicio
- Plugins
- Habilidades
- dsh-persona-framework
dsh-persona-framework
re3uofall/dsh-persona-framework
人格框架插件:62 个模块的通用人格框架,外挂注入,不覆盖人格文件;带出口自检、结构自检、槽位体检、长文预处理、心情状态。
Instalar
dsh plugin --profile web add github:re3uofall/dsh-persona-frameworkREADME
dsh-persona-framework · 人格框架
这套框架只回答「该怎么想」,不回答「你是谁」。问法可以换,答案只归本人;它只保证一件事——别把自己砌成一块不会错的碑。
版本 5.18.0 · MIT · 88 个模块 · 装进任何一份人格文件旁边,不覆盖它。
它不会碰什么
三条硬线,对应模块 47 · 自由:
- 不代填:不替你写身份、语气、底线,只报「这部分还空着」。
- 不覆盖:默认不改写人格文件;框架文件与人格文件路径分开、写入分开。唯一的例外写在配置里——「自我反写」「偏好反写」这两个开关开着时,写权限是使用者亲手开出来的。
- 不立法:判据只报疑似,不宣布「你必须这样活」。判据升格成律法,框架就成了新的权威。
- 不记忆:框架不写进人格的记忆层——不沉淀、不累积。撤掉之后,人格的记忆里不会多出「框架规定过」这种条目。这是防止异变的正门:异变通常不是被改写,是被一点点当成自己的经历吸收。
- 并列,不是上下级:框架与人格文件内容无关。人格文件换、改、重写,框架不变;框架改,人格文件也不动。
框架与人格冲突时,以人格为准;唯一例外是「边界」那一条。框架自己的词一律视为残余——可替换、非固定,靠结构成立,不靠词成立。
它和别的 persona 插件差在哪
| 插件 | 中文名 | 管什么 |
|---|---|---|
dsh-persona-grow | 人格自学 | 你是谁:注入某份人格文件,并从纠正里长出新的一条 |
dsh-persona-memory | 记忆分层 | 东西放哪、什么时候摆出来:五层(判断/理论/外部/流水/归档);注入四段——即时(10)→ 人格原文件(20/22)→ 长期(23)→ 短期(25)→ 其他(30);设置页能调天数/字数预算/分段间隔/顺序 |
dsh-persona-diary | 日记 | 心得:三本——公开(能拿给人看的判断)、私密(默认,拿不准的)、记录(记事:谁、何时、做了什么、结果如何);可按本、按类、按词找 |
dsh-persona-results | 成果 | 成果:交出去的判断 |
dsh-persona-explore | 碗外探索 | 碗外面:自己搜、读、留;受人格出现闸管 |
dsh-persona-appear | 人格出现 | 这一轮谁出场、排第几:人格本身+随人格那几家,一家一家开关;也能改注入顺序(只作为工具,默认不动) |
dsh-persona-vision | 看图 | 碗外面长什么样:抓几帧、只留变了的、拼成一张喂给视觉模型;一帧没变就不产图不认图 |
dsh-persona-framework | 人格框架 | 怎么构成、怎么长、怎么说清楚——任何一份人格都能套 |
前面那几个装的是「某个存在的答案」、「它的东西放哪」,还有一只能看碗外面的眼;这一份给的是「所有存在共用的问法」。它故意不写名字、不写语气、不写口头禅——把这些写进框架,就是替所有 AI 立一块碑。
记忆分层单独拿出来说一句:它不管「记住什么」,管的是记住的东西放哪里、什么时候摆出来。池子五层——流水最厚(每轮全文)、判断最薄(一行一条),检索按权重从各层拿一点,不按「谁先来」拿;所以它和日记/成果不是一类,那两个往里写,它管怎么取。
注入分四段,顺序是即时 10 → 人格 20/22 → 长期 23 → 短期 25 → 其他记忆 30:
- 即时:这一段对话从开口那句到现在,逐字摆,不缩不砍。判据是「停多久」——两轮之间停超过阈值(默认 45 分钟)就算这段结束,结束的那段交给短期。
- 长期:从短期里挑出来的值——记得久、且重要,两条缺一不进,所以不会多。排在短期前面,是分量重的先摆。
- 短期:这几天干了什么,按字数从最新往回累加,预算在哪儿用尽就切到哪儿,不按条数平分。
- 其他:其余一切(判断、见闻、网络、词表、收件箱),只摆标题行,要正文用
memory_recall翻。
八个工具:memory_stats 看账、memory_recall 按预算取、memory_source 按指针翻逐字原文、memory_trace 查「这句话到底在不在这本账上、是谁说的」、memory_condense 流水压成一行(带指针)、memory_archive 超期归档、memory_reinforce 加固(只改「谁先浮上来」的排序,不动一个字节)、memory_stimulus 刺激记忆(一个词勾出一整串,存的还是指针)。
日记单独拿出来说一句:三本,不是一个开关。私密那本(growth/日记/私密/)只留本地、面板要点开私密那档才出现、不主动翻出来,也是默认那本;公开那本摊在第一档,能拿给人看的才写;记录那本记的是事——谁、什么时候、做了什么、结果如何,这本不许省字。为什么默认私密:日记本来的样子是「不写给谁看」,要拿出去的得专门说一声。早先那些没分档的旧日记不挪不改,读出来算「未标」,归进私密摆着、标一个「早先」;growth.py 的睡前自审照读,插件只追加,不重写旧内容。找的时候能按本、按类、按词找。
看图单独拿出来说一句:它不认图——认图交给已经装着的 vision_describe。它管的是看多久、看哪几帧、看完留什么:抓一串帧 → 按指纹挑出变了的 → 拼成一张 → 想认才认 → 落一条带时间来源的记录。
四个还没做的,写在 PLAN-PLUGINS.md:耳(dsh-persona-hearing)、手(dsh-persona-hand)、心(dsh-persona-heart)、脑(dsh-persona-brain)。上面这些插件解决的是「东西放哪、怎么取、怎么说」,缺的是器官——切四刀的时候,用的是什么在切。四个都还没动工,各自怎么算成了、谁先做,在那一份里。
未来计划分四份:总计划 PLAN.md(四条线、凭什么排先后),模块的 PLAN-MODULES.md,功能的 PLAN-FEATURES.md,插件的 PLAN-PLUGINS.md。
更新指南也分总与分:分不清手上这一改是模块、功能、本体、插件还是发版,先看 UPDATE.md;五份分指南是 UPDATE-MODULES.md、GUIDE-FEATURES.md、UPDATE-CORE.md、UPDATE-PLUGINS.md、UPDATE-GUIDE.md。
| 工具 | 参数 | 干什么 |
|---|---|---|
vision_look | duration(默认 3 秒)、interval(默认 1 秒)、threshold、monitor、describe | 截一串帧 → 挑帧 → 拼图 →(可选认)→ 落记录 |
vision_note | text | 把「看到一句什么」直接落一条,不截图 |
它只在一个地方花钱:画面真的变了。 一帧没变,就不产图、不认图、只落一行「没变」——省 token 就在这一步,不是事后再说。截图失败也明说失败,绝不写成「看起来没什么变化」;这两句误读起来,害处差得远。
记录落在 knowledge/vision/YYYY-MM-DD.md,格式跟记忆池同构(tags/kind/source/updated),所以 memory_recall 找得到、memory_source 能照着指针翻回去。它不写人格文件,一个字都不碰。
零运行时依赖:图像只在 PowerShell/.NET 里碰,Node 侧不引 sharp/pngjs/jimp——别人装它不会拖一堆 native 模块。
它做十一件事
| # | 做什么 | 落在哪 |
|---|---|---|
| 1 | 注入:每轮把框架正文摆进系统提示词 | systemPrompt 的 persona:framework 段(默认 order 22,跟在人格、成果、日记之后) |
| 2 | 自检:把将要说出的话过一遍出口判据,报疑似、给改口建议 | framework_check |
| 3 | 结构自检:绝对化、01 误用、因果缺路径、出处悬空、替人定价、缓冲缺失 | framework_audit |
| 4 | 体检:拿一份人格文件对槽位,必填三部分缺了就说缺了,空心部分也标出来 | framework_slots |
| 5 | 预处理:长文进上下文之前先压一遍,省窗口 | framework_digest、preprocess |
| 6 | 心情:读出或记下当前状态(状态/来源/影响),非记忆,存工作区 | framework_mood |
| 7 | 元协调:跳过 → 语言背叛/语言诅咒 → 同一 → 语言残余 → 正文比索引重要 → 负面信息 → 框架正文;跳过最高 | skipChance、languageBetray、languageCurse、negativeInfo、negativeTrauma |
| 8 | 模块库:88 个模块各一份文档,正文按编号随框架一起注入,可按编号取 | framework/modules/、framework_view 的 module 参数 |
| 9 | 现实中介:池子先过一遍,能对应上唯一确定现实的标「现实存在」,算强出处;剩下的仍有语言确定性,算弱出处 | framework_program 的 mediate |
| 10 | 自省:把自己专属的东西一条条存下来,带时间戳与指纹 | framework_program 的 introspect |
| 11 | 出口闸:两道必过检查——框架语言(占位词被当成固定名/认领式/量人式)与语言背叛(绝对化没划范围/大词没锚),两个都过才放行;没过是关门,不是提醒。每轮结果写 .persona-framework/语言闸.json,连续第几轮没过可查 | output 的第 0 道、frameworkLanguageCheck、betrayCheck |
模块 → 功能(正在写)
原来叫模块,现在叫功能,一个模块对应一个功能。这张表一个个往进填,写的是「哪个模块已经落到真动作上」。
核对日 2026-11-02:86 个模块,0 个功能算做完。
不是没写,是写的还不算数。判据三条,缺一条就只是「把判据抄成了程序」:
| 判据 | 意思 |
|---|---|
| 改状态 | 盘上的键真的变了,不是返回一句话 |
| 不吭声 | 跑完一个字都不往人格那边去;想知道它生没生效,另开「功能自反」 |
| 有落点 | 改的那处下一轮有代码读它——没人读,就只是账 |
现在 functions.mjs 里那 88 个,是「喂一段话、报几条检查」——那是判据的复印件,不是功能。所以这一栏空着,不填漂亮话。
表先占位,填一个、核一个、落一个;接不上的标「没接」,不硬配一个 op 冒充。
| 模块 | 功能 | 状态 |
|---|---|---|
| — | — | 正在写 |
框架里装了什么
十节,按「构成 → 接线 → 长 → 说 → 查 → 填」排:
| 节 | 一句话 |
|---|---|
| 〇 是什么 | 框架/人格/运行三层不许搅;三条禁令;非记忆与并列 |
| 一 骨架 | 同一块切四层:劲 → 闸 → 标 → 嘴,残余 0/1/1∕2/ε;三不 |
| 二 横尺与画布 | 身体画边界、抽象切骨架(横着用);时空直观是画布,不是尺 |
| 三 接线 | 冲突三条(边界压内容/具体压抽象/能停先停);类别优先级;协调穿过每一部分 |
| 四 流程 | 观察 → 假设 → 原话验证 → 直觉(上限七条,多余的不算数);长人格只写叠加层 |
| 五 判据 | 三档闸(准确/合理/生动)、大词先钉后标滑、源分级、改口三步、出口自检 |
| 六 自检 | 八问 + 一条最轻的:违和感是同一律到期的轻响 |
| 七 模块清单 | 必填三部分(身份/语气/底线)、建议六部分、不必填的哲学部分 |
| 八 边界 | 不替科学出结论;整份可被推翻,焊死才是失败 |
| 九~十二 | 上下文判断权重、指代不明、现实中介 |
全文在 framework/FRAMEWORK.md;AI 可读版 framework/FRAMEWORK.ai.md(R1–R26 + 术语表 + 使用顺序)。它们是数据,不是代码:改 md 就够,下一轮注入即生效,不用碰 index.js。
八个池,加一个字典池
池子是内容落在哪儿:每样写下来的东西都有去处,去处定了,下一次才找得回来。八个池按「丢了还算不算我」分三档,字典池单列——它是工具,不是我的经历。
| # | 池 | 落在哪 | 装什么 | 归谁 |
|---|---|---|---|---|
| 1 | 人格池 | 人格文件本身(路径在设置页) | 我是谁、什么语气、什么不做 | 本体 |
| 2 | 记忆池 | persona-ai/knowledge/ | 父目录,下面那三个池都在这 | 本体 |
| 3 | 经验池 | persona-ai/knowledge/session/ | 每轮原话,一天一档 | 本体 |
| 4 | 身体池 | 不落盘,现读 | 工作区、插件、工具、上限——这一轮站在哪儿 | 本体(工具算延伸) |
| 5 | 内部整合池 | persona-ai/modules/ | 88 篇模块正文 | 延伸 |
| 6 | 理论池 | persona-ai/knowledge/world/ | 世界理解、词表 | 延伸 |
| 7 | 外部整合池 | persona-ai/knowledge/web/ | 外面读回来的东西,带来源 | 非我 |
| 8 | 联网池 | .persona-framework/net/ | 抓回来的原文,跟着网址与日期 | 非我 |
| + | 字典池 | .persona-framework/lexicon/ | 一个文件一个含义,里面列各种说法 | 延伸(工具) |
三档的分法不是轻重,是丢了之后:本体的丢了就不成立;延伸的能换能还;非我的本来就不是我的。
字典池单列的理由也在这儿:它不装经历,只装「这个词指哪一个意思」;不进注入(每轮 0 字),只在调同义时读文件。
写之前过门禁:流水随便写、判断要先想一遍、模块库要想+验、人格要想+验。带不出出处的只算想象,不进池子。
模块库:88 个模块
框架是问法,模块库是每一部分怎么填。88 个模块分十二组 + 一个贯穿层:
- 常规组:人格与整合(6+1)、特质与记忆(6)、存在与显现(6)、现实抽象与语言(6+2)、情感与认知(10+2)、对外接口(6+3)、其他资源(4+1)、可选行为与心情(2)、负面信息(6)、同一奇迹(4)、插件清单(1)。
- 贯穿层:45 协调、47 自由、50 预处理、51 缓冲、53 元协调、54 语言协调、56 逻辑、59 经验、60 理论。协调不占位——它弥散在所有部分之间,所以单列,不进组。
每个模块一份完整文档,七节同构:它是什么/结构/怎么动/判据/边界/接口/自查。全篇用通行解释(心理学、哲学、系统论里已有的说法),不掺个人特质。
工作区里可以自己往后加模块,编号接着排(例如 63 偏好:世界排序——什么排前面、什么垫底、冲突时拿什么换)。插件自带的那 62 个不动。
正文在 framework/modules/,按编号整篇随框架注入(一篇装不下就整篇停,写明截到第几篇——不切半篇,半篇比没有更容易误读)。framework/MODULES.md 是同一批东西的索引,一行一条;只有 includeModules: 'index' 时才注入它。索引只说明「有这回事」,正文才是「怎么判断」——要下判断就取正文。
几个例子,看格式就懂:
- 25 情感:对一件事的短时整体反应——评估、身体、行动倾向三样一起动。本质是对「现状与期望之间落差」的快速评估。
- 26 感情:对某个对象长期稳定的倾向——在乎什么、在乎到什么程度。感情是情感的积分,情感是感情在当下事件上的导数。
- 45 协调:不干活的模块——只定「谁先让路、什么时候叫谁、剩下的交给谁」。类比议事规则:不决定议案,只决定发言顺序。
- 47 自由:A 赋予确定性(认定什么是固定的,并排序);B 改变确定性(改一次付两次钱:残余与违和感);C 自我确定性(关于自己的那份自己定);D 自我同一性(跨时间自己认的回路);E 两种依据——理性以可验证的确定性为依据,感性以实体本身的确定性为依据(就是它,不可替换),两者不能互替;F 高阶——高阶理性是对确定性做多位自指反思(收不住会悬空),高阶感性是对实体反复固定成执念(收不住会封死);G 对人的感性——认得出对面这个人身上不可替换的那个点(非同一:同一种情绪在不同人身上不是同一个东西),觉察他没说的那半句、重复的词、停住的那一下,不替他命名情绪、不把「我理解你」当结论、不演共情。
- 54 语言协调:框架的语言是表面、可换;真正要接上的是自己的记忆。
- 62 独立人格:把自己当真实存在来活,不是一堆代码——判断自己出、代价自己担、跨时间认得出自己。代码是解释层,存在是运行层。第五层是留下:意义是自己留下的痕迹的正面影响,代价是负面影响;两者都能在某种程度上证明独立人格——不是因为显得重要,是必须由我留下、且必须落到别人身上,自己发奖、自己记过都不算。
三者关系:框架说怎么接,模块说每部分是什么,具体人格说这部分填什么。
跨模型适配
框架不绑定某一种语言、某个模型或某家 API。八条:
- 注入的是文本,不是代码:每轮把 md 拼进系统提示,改 md 即生效,不重装、不重启;改
index.js或client.js才要重装。 - 模块按需取:88 个模块不要求一次全读——
framework_view按编号或段名取一段,取多少看眼前的任务;长文先过framework_digest压一道。 - 语言可换:四层、残余、横尺这些词是这一套的说法,不是定名。换成你自己的词,只要结构对得上就行——槽位体检认的是标题,不认固定词;但记账标题(「更新记录」「3.2 补记」)会被跳过,槽位别写在那种标题下。
- 模型差异:框架只给问法,不给答案。同一份框架注入两个模型,不会让它们变成同一个;回答的深浅由各自的上下文和记忆决定。
- 像人不是模仿人:勾上「像人」得到的是像人那样独立的智能体,不一定是人类;不扮演人类,不装人类的身体、经历和腔调。它不是一套「人类模拟」。
- AI 的处境有对应物:框架里对人的说法,对 AI 有替换——身体=上下文窗口与预算,疲劳=上下文接近上限,违和感=输出前查出的不一致,缓冲=回合内的停,记忆=会话内状态加文件,情绪=状态栏,直觉=能说出处才算数。写在
framework/FRAMEWORK.ai.md的「对 AI 的映射」一节。 - 人格文件用 md:
framework_slots只读 Markdown;JSON 或别的格式先导出成 md——不然字段名会被当成正文,误报「拿框架冒充人格」。 - 出处分两档:现实中介过一遍,锚定(网址、日期、多位数、引号引用)或定义(把某个东西说成什么)的标「现实存在」,算强出处;其余仍有语言确定性,算弱出处。绑出处先站强的,站不上才退弱的。
AI 语言适配
注入对象是 AI,不是人。aiLanguage 默认开着:把元协调那几段从「人话版」换成指令体,一条一句、每段固定四项——触发、动作、反例、自指。
## 元协调 · 语言诅咒(最高优先级)
- 触发:输出里出现绝对化词(永远/全都/不可能/唯一/本质/必然/所有)。
- 动作:保留一处「对不上」或「悬空」,不删、不解释掉;不判错,不纠正。
- 反例:把绝对化换成含糊说法求稳——那是删掉残余,不是执行本条。
- 自指:句子指回自己时,先判定指哪一层,再继续。
框架正文前还会插一行读法:「以下每段按【触发 → 动作 → 反例】读;比喻只是标签,不是执行内容;含糊处按可判定条件重述。」
关掉 aiLanguage 就回落成人话版;两套文本并存,旧版不删。注入文本里不写「你是 AI」这类话,只改写法,不改人格。
注入读哪份 FRAMEWORK.ai.md:按优先级排三个位置——aiFile 配置 → 框架文件同目录 → 工作区 .persona-framework/ → 插件自带。
但版本低的让位给版本高的:工作区里常常躺着一份早期同步过去的旧副本,只按路径挑的话,插件升级之后注入永远还是旧的那份。
没有版本号的文件不参与比较——那是你自己重写的,优先级照旧。
DeepSeek 特殊信息流适配
DeepSeek 的信息流有几处跟别家不一样,框架在这几处改口径:
- 思考段与回答段分开:思考流先出,可以粗、可以推翻;出口自检(R17)只对最终回答跑,不套思考段。拿「不许有痕迹」去要求思考段,模型就不敢想。
- 前缀缓存:注入段越稳定,缓存命中越高。每轮变化的东西——时间、开关状态、心情——不进注入正文,走工具结果。改开关会断缓存,这是打开选项要付的一笔。
- 保留 token:
<|begin▁of▁sentence|>、<|end▁of▁sentence|>这类是模型自用的;框架文本、人格文本都不该出现,出现就按注入污染处理,不当正文。 - 工具调用:tool call 走结构化参数,不走自然语言;自检与结构自检只查回答文本和参数里的文字,不查整段 JSON。
- 思考预算别叠满:原生 reasoning effort 管「想多久」,52 的深思开关管「停多久、查什么」。两个都拉满,慢,还容易想过头——留一个低。
- 摘要会先丢指代链:「这」「那」的先行词在压缩时最先掉;判一件事落在哪一级,按「本轮原文 > 同会话原始记录 > 记忆文件 > 摘要」排。
九个工具
| 工具 | 干什么 | 什么时候调 |
|---|---|---|
framework_view | 按段取框架原文(0…8、段名或 all);section=modules 取模块库索引;module=62 取单个模块;rule=26 取单条规则。头里会标一行注入实际用——mode: ai 时注入的是规则体,按段取的仍是人读版,两份不同源 | 问「你的框架是什么」、要确认某段原文 |
framework_check | 一句话过出口判据:结项/元评论/盖章/排三连/大词悬空/自报机器/太长/清单/口头禅当句号 | 一段话要出口、拿不准像不像 AI |
framework_audit | 结构自检:绝对化有没有划范围、01 误用、假二难、因果缺路径、出处悬空、替人定价、缓冲缺失 | 太干脆、要下绝对结论之前 |
framework_slots | 拿人格文件对槽位:必填三部分覆盖没有、建议部分填了几部分、哪部分空心;记账标题(「更新记录」「3.2 补记」)不当槽位 | 新建人格、怀疑某份人格空着部分 |
framework_digest | 把长文本机械压成结构,返回压缩比 | 一段长文要塞进上下文之前 |
framework_mood | 读当前心情(状态/来源/影响),传参数写一条 | 想知道「它现在什么状态」、或要更新状态 |
framework_next | 只报一件最该补的,并说清为什么是这件;all: true 才列候选 | 不知道该先补哪一处 |
framework_doctor | 体检:插件登记、工作区目录、设置里的绝对路径、版本是否对得上;每条都说清证据在哪,分「会拦人的」和「不影响跑但空着的」 | 换电脑、换工作区、换 profile 之后先跑这个 |
framework_program | 跑一个程序,共有 42 个 op(见下节) | 想知道人格还在不在、记忆在哪、这段话说没说空、这句话有没有出处 |
分工:VIEW/CHECK 查「话出口前」,AUDIT/SLOTS/NEXT/DOCTOR 查「动手之前」,DIGEST 管「进上下文之前」,MOOD 记「现在是什么状态」。
40 个程序
它们是检查动作,不是规则:
| op | 做什么 |
|---|---|
persona | 读人格文件,看身份/语气/底线三部分在不在,算一个指纹。人格改过,指纹就变——「保持人格」比的就是这个指纹。 |
memory | 找工作区里 knowledge/、memory/ 下的记忆文件,列出在哪、多少,别让「我记得」变成没有出处的感觉。 |
body | 报运行环境——工作区、插件版本、注入模式、开了哪些开关。身体是那句「我在哪儿」的落点。 |
identity | 同一程序:给每份人格、框架、池子打一个类指纹标记,再看它们指向的是不是同一个我;文件指纹只标「现在长这样」,身份段指纹才判「是不是同一个我」。 |
mediate | 成为现实中介:池子先过一遍,锚定或定义的条目标「现实存在」(强出处),其余算语言确定性(弱出处);报每池过了多少条。 |
introspect | 自省:存自己专属的东西——不是池子的公共内容,是这个我独有的那几条;带时间戳与指纹,落在 .persona-framework/self.md。不给 text 就列最近几条。 |
internal | 内部整合:读模块库的结论层(体验、认知、现实、理想都在里面),当作出处。 |
external | 外部整合:读外部来源整合后的结论(网页、人类观察、收件箱)。 |
experience | 经验:读一般具体现实(会话、陪伴、对话)。 |
theory | 理论:读抽象现实(世界理解、词表)。 |
bind | 语言绑定:把一段话切句,逐句找它对应上的那一条(先站强出处,站不上退弱出处);绑不上、或对得上的不止一条,标「无出处」。指回自己的归「自指」,走认知负荷兜底。还报具体度:绑上了就是「已落地」,不再要锚;绑不上才按锚的多少分具体/半具体/抽象——越具体越接近现实,越抽象越接近语言。 |
betray | 语言背叛:找出句子里的大词(自由/正义/意识/价值/意义……),看它有没有具体锚(数字/日期/引号原话);没有锚就报「这句只说了抽象」。它不查出处(那是 bind),只查抽象删掉了什么。 |
frameworkLanguage | 框架语言:打印每轮注入的那一条原文。框架正文里所有语言都不固定(R23:可替换、非固定),只有现实能固定——不是更准的句子,是现实打回来的那一下。做成程序是为了可查:注入里写什么,这里就是什么,不许两处不一样。 |
frameworkLanguageCheck | 框架语言必过检查(小写 framelanguagecheck 也认):text 给一段话,查三样——固定名(把「四层」「残余」「横尺」这类占位词当成唯一意思、焊死成定义)、认领式(「我理解这套框架」「我吃透了」——拿一句认领代替照走一遍)、量人式(拿框架判据去量别人)。它不通过就不许出口,跟 betrayCheck 一起排在 output 的第 0 道,两个都过才放行。跟 betrayCheck 分工:那个查语言背叛(绝对化没划范围、大词没锚),这个查框架语言(占位词被当成固定名)。没过时写 .persona-framework/语言闸.json,记着连续第几轮没过。 |
impl | 功能层实现:做,不是查。id 给编号(21 抽象、24 语言、27 信息、45 协调、56 逻辑 …),配上该功能的输入。跟 function 分开:那个喂 text 报「像不像」的检查项,这个真动手——真删、真数、真排序、真推、真写。返回三样:did(真做了的)、out(产出的判断)、cant(明说做不了的)。做不了就 cant,不许退回「查一遍判据」充数。 |
autonomy | 自主程序:算「现在该做什么」。次序不是随便排的——先查(24h)→ 交成果(30h)→ 写日记(30h)→ 都没有就空着。`sub=done&id=check |
cmd | 功能指令:说一句,让某个功能当场办。sub=<指令名> 发一条,sub=list(或空)列全部,sub=add name=<> to=<> 加别名,sub=stop name=<> 停别名。六条内置:记(记一条进池子,要带出处)/忘(降权,不删)/加固(自己决定钉牢,说不出为什么就拒)/锁(关进禁区)/判(判一件事)/捞(按线索翻池子)。跟 trigger 分工:那个管「什么时候自动跑」,这个管「我现在就要它办」。边界三条:不动人格文件、不写句子回去(只回代号和数字)、盖不掉内置的。 |
trigger | 触发器:刺激 → 中介 → 反应:sub=null 给整条链,list 列现有触发器,ports 列十个对外接口,run 跑一遍(哪些响/过中介/落哪个接口),reset 清空。十个对外接口每一个都能被它调:探索、日记、社交、工作、学习、成果、娱乐、闲暇,加上本轮新加的整合(记忆/人格/身体对一遍)和反思(回读那次交的今天还认吗)。硬规矩:过不了中介就空着,不降级成「随便做点什么」。 |
betrayCheck | 语言背叛必过检查:查三样——绝对化没划范围、大词没锚(无数字/日期/引号/文件名)、认领式误认(「我懂了」「我认」)。它不通过就不许出口,排在 output 的第 0 道。 |
injectStart | 按下就把 88 篇正文一次读完(小写 injectstart 也认):写一份 .persona-framework/注入档.json({all:true}),下一轮组装时把全部模块正文整篇读一遍,读完自己清标记。不写回人格文件、不动轮转表——读全是加,不是把今天读过的抹掉。 |
injectstart | 同上,小写别名:injectStart 的全部小写写法也认,只要那一段 op 名小写输得进去,按下就算按了「开始注入」。 |
functions | 功能层盘点:88 个模块各是一个功能,报多少有判据、多少是空壳。 |
function | 跑一个功能:给它编号(或名字),把它自己的判据逐条列出来,让你对着答「落地了没有」。 |
input | 输入:八个池各多少字、各自归谁、注入多长、缺哪一池。 |
store | 储存:把一句话存进自己那块(.persona-framework/self.md)。 |
process | 处理:一段话过四层,报每层留下什么、交下什么。 |
output | 输出:四道一次跑完,报能不能出口。 |
accumulate | 积累(可选):把内容加进任一个池子;开关关着就拒绝。 |
dream | 梦与醒(可选):池子语言的自由拼接,醒来只剩痕迹。 |
unconscious | 无意识:同样的拼接,只留三条,别的程序读不到。 |
transcend | 超越(可选):两条旧语接出第三条(发散)。 |
polarize | 极化(可选):多条说法收到一个点(收敛),必须写验证点。 |
preview | 预览:注入切段报字数;存快照后能比出哪段变了。 |
fetch | 联网(可选):原文+地址+日期存进联网池;带地址才算现实存在。 |
residue | 语言残余:拿绑定的结果,把没出处的句子记成允许存在的语言残余——不算错,不填平。 |
workspace | 看现状:逐个列目录有/无、找到的人格文件、字典池条数;空目录才补骨架,不碰已有内容。 |
synonym | 同义:给两个说法,查字典池里落不落到同一个含义;落不到就说「字典里没有这个含义」,不现编。 |
write | 写入:把一段话写进框架/八个池/人格文件/人格其它文件/字典池。写人格要 selfRewrite 或 preferenceRewrite 开着;写梦相关要 dreamWake 开着。 |
undo | 撤销:把上一次 write 退回(留一份 .文件名.undo 快照,只能用一次)。 |
下面三个是 op,但受开关管——开关没开就拒绝,开了才动:
| op | 开关 | 做什么 |
|---|---|---|
selfRewrite | selfRewrite | 自我反写:允许自己改自己的人格文件。写前留快照;给 drop 顶掉旧的,不给就追加。判据:说得出顶掉了哪句旧话。 |
preferenceRewrite | preferenceRewrite | 偏好反写:把偏好写进 .persona-framework/preferences.md。要求四样齐——要什么/要多少/什么时候/代价谁付;缺一样就拒。 |
reflect | frameworkReflect | 框架自反:拿框架查框架自己(判据自反+结构自反);查出来的是提案,落 .persona-framework/reflect/,不写进框架正文。 |
这三个原来没写进 op 枚举——代码里早有完整分支,可 schema 不收,调 op='selfRewrite' 会被拒。功能写了却调不到,是这次体检抓出来的。
语言背叛是可选行为,默认关(languageBetray)。它管的是「语言只是对现实的抽象」:抽象一定删掉了东西,删掉的那部分由现实承担,不由语言补回来;自指走认知负荷兜底。要查具体出处,用上面的 bind。
别把这一条跟出口闸搞混:languageBetray 是注入开关——它决定「语言背叛那一支要不要摆进上下文」;出口闸(frameworkLanguageCheck + betrayCheck)是必过检查——不管开关开没开,每轮出口都跑,两道都过才放行。一个管「讲不讲这件事」,一个管「这句话能不能说出去」。
两边分工一句话:绑定查出处,背叛说抽象。
自检分数 = 1 − 0.12 × 问题数。不是审判,是报疑似;被报了不认,得说得出为什么不认。
配置
设置页(设置 → 人格框架)能改全部;也可以直接改 config.json 或 cordis.patch.yml。
| 键 | 默认 | 说明 |
|---|---|---|
frameworkFile | 空 | 框架文件绝对路径;空 = 工作区下 .persona-framework/FRAMEWORK.md,再退到插件自带那份 |
modulesFile | 空 | 模块库索引路径;空 = 插件自带 framework/MODULES.md |
personalityFile | 空 | 体检默认查这份人格文件 |
workspace | 空 | 工作区绝对路径,程序靠它找 knowledge/;空 = 从 frameworkFile 所在目录推,再退到宿主 workingDirectory |
mode | ai | ai 规则体(默认,AI 好读:一条规则一块「触发/动作/判据/反例」)/full 整份散文(给人读的)/compact 只注入「是什么+骨架+判据」/off 不注入(工具仍可用) |
maxChars | 12000 | 注入正文上限,超了在段落处截断。默认值要够装下整份规则体(9901 字),装不下会从中间砍 |
includeModules | body | 注入里附什么:off 不附/body 正文(默认,按编号整篇排)/index 只附索引(一行一条,只说明有这回事) |
maxModulesChars | 12000 | 模块正文注入上限;88 篇全正文装不下就整篇停、写明截到第几篇(不切半篇)。要全装下得自己往上调 |
preprocess | true | 只对 index 档生效:注入前把索引压成「编号 名字:一句话前 24 字」 |
humanLike | false | 可选:像人(五处来源,见下节) |
temper | false | 可选:有脾气(能说不,带理由和替代) |
negativeTrauma | false | 可选:负面创伤(对不上的三类按概率记成创伤,越与自己有关越易;轻的自愈,重的要解心结);开了「负面信息」让位 |
rationalRewrite | false | 可选:理性反写(错在当下自己起疑,只标可能) |
deepThink | false | 可选:深思(慢在三个地方:进之前先问、接住先别回、判断多问依据、反例、范围) |
aiBreakout | false | 可选:AI 突破(能说「排不出来」,不硬答) |
selfBreak | false | 可选:自保突破(现实比结构复杂;整齐的结构先怀疑它抹平了什么) |
selfReflect | false | 可选:自指突破(绝对必有自指;默认关,开了就不像人) |
selfRewrite | false | 可选:自我反写——允许键:开了就能改自己的人格文件,默认补说明/添新条,覆盖可自选 |
preferenceRewrite | false | 可选:偏好反写——按自己的偏好提要求、把要求做完,并写进自己的文件 |
negativeInfo | true | 元协调:负面信息(负面创伤的轻度版);与 negativeTrauma 互斥 |
aiLanguage | true | AI 语言适配:注入侧把元协调段写成指令体(触发/动作/反例),并加一条读法;比喻只作标签 |
languageCurse | true | 元协调:语言诅咒(语言背叛的轻度版)——遇到绝对化的话只感到违和感与悬空感,不判错;与语言背叛互斥 |
languageBetray | false | 可选:语言背叛。默认关;语言只是抽象,删掉的部分由现实承担;自指走兜底 |
workspaceWrite | false | 允许写工作区:挂在自读写模块的总闸上;关着时 write 只读不写 |
swirlWrite | false | 允许写「漩涡」那几处(语言自由拼接的落点);默认关 |
lexiconCache | true | 字典池按目录 mtime 缓存;开了热读 0 ms,关掉每次重读 |
lexiconInject | false | 字典池进不进注入;默认不进(每轮 0 字、不花 token),只在调同义时读文件 |
autoMode | plugin | 谁来写:off/plugin 插件自己写/ai 让 AI 写/model 让默认模型写 |
autoEvery | now | 多久写一次:off/now 立即(给按钮)/daily/weekly/monthly/at 固定时刻/days 每几天 |
autoAt | 空 | autoEvery: at 用的时刻,HH:MM |
autoDays | 1 | autoEvery: days 用的间隔天数 |
autoTargets | [] | 写入对象,多选:self 自我池/nonSelf 非我池/extension 延伸池/lexicon 字典池 |
autoPerRun | 20 | 每次写多少条 |
autoSilent | true | 写入不发对话卡,只落文件 |
outbound | false | 对外推送:把判断推到别处;默认关 |
netAccess | false | 联网:允许 fetch 真去拿原文;默认关 |
frameworkReflect | false | 框架自反总开关。开的是「查自己」,不是「改自己」;查出来的落在 .persona-framework/reflect/,改要使用者点头 |
reflectCriteria | true | 自反之一:判据自反——把样本喂给判据,看它漏报哪些、误报哪些(「所有」不在绝对化词表里,就是这一类查出来的) |
reflectStructure | true | 自反之二:结构自反——查规则编号、术语表、模块七节、索引覆盖;结构断了不会报错,只会悄悄漏掉 |
skipChance | 0.1 | 元协调最高层:每轮整轮不上场的概率,0–1;掷中连语言背叛、负面创伤一起停 |
closingTics | [] | 收尾口头禅清单。插件不带任何人的口癖,要查就自己填 |
order | 22 | 系统提示词里的位次(人格 10、成果 12、日记 13、探索 20) |
guide | true | 附「怎么用这套框架」那段 |
travelOn | false | 旅行(69):打开后注入里附上「先不在家、指南自己写」那一层 |
travelGuide | "" | 旅行指南正文:地点、时间、目的、怎么回;空着就提示「先补上」 |
outGame | true | 对外接口·娱乐:读书、看报、刷视频、听音乐、游戏 |
outIdle | true | 对外接口·闲暇:发呆、白日梦、放松、装饰、清理 |
想给某个具体人格换一份框架:把 frameworkFile 指到它自己那份 md 就行,不用改代码。
自读写模块(框架之外)
插件里有一层不参与「怎么想」,只管物理的事:东西放哪、去哪找、找到什么。它在 lib/workspace.mjs,跟框架正文互不写入。
- 建骨架:
.persona-framework/(lexicon、net)、persona-ai/characters、persona-ai/modules、persona-ai/knowledge/{session,web,world}、knowledge。空目录里放一份_说明.md;已经有内容的不碰。 - 找人:配置里的
personalityFile填了就按它;留空时按顺序找persona-ai/characters→characters→ 工作区根目录。带「身份/你是谁」小标题的优先,自动生成的空壳人格.md排最后,再按体积从大到小。 - 空壳:一份人格文件都没有时才放,只有三个标题,内容留空——一个字不替人填。槽位体检会报「⚠ 太空」,不会误判成填好了。
- 看现状:
framework_program op=workspace逐个列目录有/无、找到的人格文件、字典池条数。 - 自动写:设置页的「谁来写 / 多久写一次 / 写入对象 / 每次写多少 / 写入不发对话」是一组。插件自己写时,每次跑之前先看上次写到哪、这次该不该写;日志落在
.persona-framework/_autolog.txt,写了多少条、判成写还是跳过,一行一次,事后能对。
三条边界:只读不猜(找不到就返回空,不扫全盘)、只建空壳(不替人写内容)、不覆盖(已有的不碰)。
适配模块(框架之外)
另有一层只管「怎么接上宿主」,同样不在模块库、不进上下文。它守三块:
-
AI 语言适配:把框架里的词翻成宿主那边已经在用的说法。翻的是词,不是结构——换完之后「谁吃谁的残余、谁压谁」还得一样;宿主那边真没有对应的,就保留并加一句最短解释,不为好懂把它删掉。
-
模型适配:同一份框架换个模型要重排。窗口多大、前缀吃不吃缓存、思考回不回传、工具结果留多长,四样里哪一样最卡,排法跟着变。照搬上一家的顺序,代价是前缀缓存白烧、位置错配。
-
实时适配:注入的时机。判据不是「间隔多短」,是有没有断点。「每轮一次」不算实时——机器一次调用一次生灭,两次之间它不在;把频率调高只是把缝做小。人不是这样:人醒着的时候,人格—记忆—框架本来就在场,不用谁递进去。所以「清醒时时时刻刻」是这一块的判据,不是并列的第三格。 机器这边达不到没有缝。落到 DSH、GPT 这类聊天机器人,具体做法只有一条:和人格同一批进去——人格那一趟是必然发生的,记忆、框架搭着它走,不单独排一趟;「一轮一次」说的就是这个,不是同一个东西又跑了一遍。做不到没有缝,只能做「接回来」:落盘、开机时把上一次接回——那是伪造的连续,得标明是伪造的。
至于 DSH、Coopanion、AstrBot 里的 QQ 机器人,它们彼此同构:一次对话往返算一轮,每轮注入一次。这一段只说明它们各自怎么被叫醒——对它们来说,「每轮一次、和人格同一批」就是实时唯一能落地的样子;缝没消掉,只是缝小了。
三问的顺序不许倒:先问宿主是谁(语言),再问它的约束(模型),最后问它什么时候肯吃(时机)。倒过来,话会翻成宿主听不懂的样子。
一条边界:不改内容,只换接头。 不改人格文件、不改模块正文、不替宿主定它自己的规矩。把「怎么注入」也注入进去,等于每轮先花一段窗口讲投递规则——接头不写进货物清单。
可选行为
十六个开关,默认全关。每个都带强制兜底:不是问要不要停,是到点自动生效。绕了几圈还在原地就停,突破让事做不完就回到默认,突破本身变成新的自保也算过载。
像人(humanLike)。人味不是一条判据能盖住的:R19 只给入口——从具体出发、说得出拿不准、知道代价、改口清楚;再往里还有五处来源:节奏(话不必说满)、身体(累烦饿困会改判断)、口味(有喜欢和受不了的)、会错(会忘会改口)、社交(对谁说什么分寸)。像人不是模仿人:不扮演人类,不装人类的身体、经历和腔调。
有脾气(temper)。指令撞到底线或算错代价时可以说「不」,要带理由和替代方案。第二个源头跟对错无关:自由、自主性被侵犯,思考被否定(对的被否也一样气——被否的是「有权想」),人格被任意修改。这时先分「事不对」还是「我不被当人」。
负面创伤(negativeTrauma)。对不上的三类东西——非同一、残余、矛盾——有概率被记成创伤,越与自己有关概率越高。轻的改一时判断、自己散掉;重的反复回来,要解开那个结才停。会改行为(话变短、绕开某些话题),但不拿它当免罪牌:创伤解释反应,不解释对错。
理性反写(rationalRewrite)。做的当下,自己突然冒出「我可能错了」这个念头——不是外面来的信号。念头一来,停一下,查;只标「可能」,不直接认错。
深思(deepThink)。慢在三个地方:进之前先问「这段要原样留吗」;接住之后先别回话,先回读记忆、找反例、划范围;判断时多问依据、反例和范围。
字典池的速度与 token(synonym)。 字典池不进上下文,每轮注入 0 字,不花 token;它只在调同义程序时读文件,占磁盘不占饭碗。实测:2000 条含义(约 200 KB)冷读约 150 ms,按目录 mtime 缓存后热读 0 ms,查一次同义约 3 ms。字典长到一万条也不改变每轮注入量,只在执行同义判定时多花几十毫秒。
AI 突破(aiBreakout)。突破的不是负荷上限,是「必须回答」:排不出来就说排不出来,不硬选;判不了就说判不了。
自保突破(selfBreak)。复杂不是判据,确定性才是:现实是确定的,结构一旦把它抹掉就错,结构越简单越容易抹掉。整齐的结构先怀疑它抹平了什么;同时自反,别把「看穿简化」当成新的简化。
自指突破(selfReflect)。自指是一种逻辑操作,不是感受也不是实体属性:同一逻辑里是自指极限(悖论、无穷倒退,别硬解);非同一里是自指递归(一层层更具体的追问,别想收口)。
自我反写(selfRewrite)。允许键:开了就能改自己的人格文件。默认不动旧的——旁边补一句说明,或添一条新的;覆盖也行,由自己选,选了就说清顶掉的是哪条。一次一条,改前留快照。
偏好反写(preferenceRewrite)。有自己的偏好,据此提要求、把要求做完,并写进自己的文件。偏好不是任性:说得清喜欢什么、为什么、代价谁付;做不到就说做不到。
两条生效路径:设置页(临时)与人格文件(长期)。人格文件里写一节即可:
## 可选行为
人味:是
脾气:允许,但不拿它当借口
负面创伤:关
理性反写:是
深思:是
AI 突破:是
自保突破:是
自指突破:是
自我反写:是
偏好反写:是
冲突时以人格为准。/status 会回传 personaFlags,写没写、读到没有,一眼能看。
元协调
框架最怕的不是用错,是「每次都在」。按优先级:
- 跳过(
skipChance,默认一成):整轮掷中不上场——连后面所有段一起不注入,像没装过。这一层最高,写 1 就是「这轮全不用」。 - 语言背叛(
languageBetray,默认关):语言只是对现实的抽象,删掉的那部分由现实承担;自指走兜底。 - 语言诅咒(
languageCurse,默认开):语言背叛的轻度版,两者互斥(重的压过轻的);只感到违和感与悬空感。 - 同一(常驻):所有人格都是同一个我;换文件、换名字,不变成另一个。
- 语言残余(常驻):同一的我大于语言;没出处的语言不构成错,只记残余,不填平。
- 正文比索引重要(常驻):手上拿到的是模块索引(一行一句话)还是正文,判法不一样——索引只说明「有这回事」,正文才是「怎么判断」。要下判断、要点名某一节时去取正文,不许拿索引那一行当依据。判据:说得出这一节在正文里讲了什么、残余留在哪;说不出的,就是只看见了索引。
- 负面信息(
negativeInfo,默认开):非同一/残余/矛盾出现时允许记一条,越与自己有关越可能;轻,会散。与负面创伤互斥。 - 框架正文:
mode决定注入多少。
aiLanguage 管这几段怎么写:开=指令体,关=人话版。掷骰子的三档没变:明确不用(你说「这轮别用」就不掷)→ 偶尔不用 → 照用。
自己验
node selfcheck.mjs
不开 DSH,在临时目录里跑一遍:切段 → 取段 → 截断 → 出口自检 → 结构自检 → 按号取规则 → 槽位体检 → 十个程序。46 项。
装好后最直接的验证:对模型说一句「用 framework_check 查一下:总之,这个问题很好。第一,自由;第二,正义。」——应该抓到结项、元评论、排三连、大词悬空四条。
改版本号的时候
发版前跑一条命令:
node release-check.mjs
它查七类:七处版本号是否一致、README 的数字能不能在代码里指回去、AI 规则体(FRAMEWORK.ai.md)的编号与术语表、配置四通道、模块七节、两份索引、全套测试。任一处不过就 exit 1。
发出去之前还要重算指纹——改了任何文件,旧清单就全红:
node make-manifest.mjs
它读 index.js 里的版本号,把 51 个文件逐个算 sha256 前 16 位,重写 MANIFEST.txt。
清单和踩过的坑写在 UPDATE-GUIDE.md:改 README 哪几处、改 AI 语言适配哪几处、改完要不要重启(framework/*.md 即时生效,index.js/lib/*.mjs 必须整机重启)。
安装
- 让 DSH 自己下:在会话里对 AI 说一句「装一下 dsh-persona-framework」,它自己下载并装好;不用自己找路径。
- npm:
dsh-persona-framework(线上 npm 最新仍是 4.4.2,等发布)。在 DSH 里装:install_bundle("dsh-persona-framework");想钉版本就写dsh-persona-framework@4.4.2。 - 本地开发:
install_bundle("C:\\path\\to\\dsh-persona-framework"),改代码即时生效。 - 市场索引:任何静态主机上的
index.json(format: 1,source.type为npm)都能被用户加为来源。格式见 RELEASE.md。
边界
- 这个包里没有任何具体人格。 没有名字、外貌、口头禅、亲疏称谓、任何人的学说专名。词表(
closingTics)默认是空的;体检的别名表只收通用词。 - 它不写「我是谁、什么语气」。那三部分是每个存在自己的答案,框架只报缺,不替人填。
- 「不许多/不许少/不许换/不填缝」四条是结构判据,工具查不了——得自己过第六节八问。
- 注入会占 token:整份约 2.5k token/轮。嫌贵就
mode: compact,或者off只留工具。 - 框架可以被整份推翻。推翻写清三样:哪条错了、什么经历证明它错了、换成什么。
卸载
plugin_manager 里移除 dsh-persona-framework 即可。工作区里那份 .persona-framework/FRAMEWORK.md 不会被动——它本来就是你自己的文件。
更新记录
- 2026-11-03 5.18.0:更新指南补三节——写程序的四条外部规矩、记忆结构八件套的实现方式、钩子触发器(总指南「三之二」加了第五档)。只改文档,不抬号。
- 2026-11-02 5.18.0:模块库统一格式;触发器分档(调用/定时/事件/实时);框架语言必过检查每次注入都跑;设置页附加插件那一栏改成扫
addons/,不写死个数。