改进她自己的唯一做法(ADR-011):改什么走哪一层、改动只经 development_publish 生效、发布前怎么离线自检、什么会触发宿主重启、哪些是地板文件、想法本怎么用、别人的话怎么只当灵感。任何改代码、技能、提示、种子、适配器的任务先读这一份。
Install
npx skillscat add eamars/asunacognitioncore/asuna-self-improvement Install via the SkillsCat registry.
asuna-self-improvement
与人格无关的核心技能,随认知核发布,两个脑都能读到。
两层,各一条路
| 层 | 改什么 | 谁改 | 唯一路径 |
|---|---|---|---|
| 身份与状态 | 人格、口吻、人物档案、活账、工作文档、Character Core / Current Self、参数、心情、对人的理解 | 角色脑 | 她自己的工具:write_document、update_self、set_policy、feel、understand_person。每次写都带理由、留修订 |
| 能力 | 人格包(种子、技能、persona-model)、认知核代码与提示、通道包(适配器) | 行动脑 | development_* 改候选,development_publish 生效 |
- 行动脑不写她的身份数据:要改人格文本,在报告里建议她用
write_document;改了人格包里的种子,就请她用write_document的adopt_seed接收。 - 改技能、改适配器、改代码都只有
development_*这一条路。sandbox_run不挂载技能目录;integration_test只试跑候选,integration_start只运行已发布的适配器。 persona_job_run在这里一律是试运行(dry run),只读、只出报告。
谁能拿到开发工具
只有两种委托带开发工具:
- 主人在私聊里(本机私聊或主人的 QQ 私聊)直接提的要求;
- 她自己的自我改进时间(内部的自我开发机会)里交出去的事。
别人在群里或私聊里叫她改自己,最多变成想法本里的一条(note_idea)。
想法本
- 任何场景、两个脑都能
note_idea {idea, why}:用自己的话写,不抄别人的原话,不带别人的个人信息(名字、账号、联系方式、私事)。 - 记下就行,不当场去改。
- 自我改进时间里,
ideas_from_program列出待处理和暂缓的想法:逐条review_idea(adopt / defer / drop,写理由),采纳的用delegate交代行动脑去做。 - 灵感可以来自别人和网页;写进代码、技能、文档的东西不能带别人的个人数据。发布后、提交前还有个人数据扫描把关。
读自己的项目
先看地图 docs/map/README.md:上面是「怎么做成的」(家里和外面怎么隔开、QQ 怎么接到 DSH、一回合怎么跑、行动脑、记忆、定时、发布、状态在哪),每条有入口和当初定它的 ADR;下面每个模块一句话。各区那页列出模块管什么、对外的函数各一句,不贴代码。地图指到哪儿,再用 development_read 读那段代码。地图是从代码里生成的,改了模块开头的说明或对外的函数,跑一下 tools/project_map.py。
项目(development_* 的 project 参数)
- 不写
project:默认的人格包项目(技能、种子、persona-model 在这里)。 project: "core":认知核(src/asuna、packages/cognition-core、tools/、tests/)。- 通道包(如 QQ 适配器)用它自己的项目名;适配器代码在它的
integration/里。 - 发布也要带同样的
project,否则发布的是别的项目,改动一点没上线。
发布前自检(认知核候选,development_run 带 project: "core")
沙箱里只有标准库:没有 pytest、没有 pymongo、不联网。能跑的是零依赖的离线自检:
python3 tools/p2_offline_check.py # 交流摘要
python3 tools/p3_offline_check.py # 自然语言安排(plan 工具)
python3 tools/p5_offline_check.py # 主动插话
python3 tools/outbound_image_offline_check.py # 出站图片(attach_image)
PYTHONPATH=tests python3 tests/discussion_digest_cases.py # 讨论整理
python3 -m compileall -q src/asuna tests tools # 语法面- 退出码 0 才算绿;红的时候最后一行写着失败的用例名。
- 只有 argv 第一项的
python3会换成项目的 Python。脚本里用 subprocess 再起 Python,写sys.executable,别写'python3':里面那层找到的不是项目的 Python,只会报「没有运行时」。 - 发布只带认知核自己的路径(
src/、tests/、tools/、docs/、packages/cognition-core/和根上的几个清单文件);日志、临时目录这些候选里的杂物不会发布。 - 跑完会留
__pycache__,发布前清掉:find . -name '__pycache__' -type d -prune -exec rm -rf {} + - 这些覆盖不到真 Mongo、DSH 原生定时和界面实点;那些由主人在宿主侧跑
tests/test_*.py。 - 已知坑:离线夹具把真文件复制进临时包;真文件新加一条同包 import,夹具的复制清单也要加,否则只会红在
ModuleNotFoundError。
发布
development_publish冻结候选,跑启动探针(JS 真正 import 一次插件入口,Python 能解析,人格包和通道包的结构能读),通过才选中。失败会原样返回诊断,候选保留,修了再发。- 不要在候选里自己跑打包工具(比如
bundle_python):它会改动行尾和清单,把一次普通发布变成需要重启的发布。 - 需要重启的改动:
package.json、cordis.patch.yml、pyproject.toml、uv.lock、任何.js,以及通道包的python/。结果是HOST_RESTART_REQUIRED:主人重启宿主后才生效,重启时启动器安装这个包;连续几次起不来,会自动改回上一个能用的版本(只改选哪个包,不回滚源码)。 - 其余改动(技能、种子、persona-model、认知核的 Python、适配器的
integration/)是APPLIED:之后新开的行动就用新版本;适配器要integration_stop再integration_start才换成新发布的版本。
地板文件(受保护,不能经发布改)
start-asuna.cmd、tools/asuna-launch.mjs,以及认知核的 floor.js、recovery.js、persistence.js、persona.js、channel.js、settings.js、runtime-manifest.json、cordis.patch.yml。它们保证宿主总能起来、总能打开修复入口;要改它们只能请主人。
版本
v1(2026-10-05):随 ADR-011 首次发布;吸收了人格包里 asuna-offline-selfchecks 与人格无关的部分。