eamars

asuna-self-improvement

改进她自己的唯一做法(ADR-011):改什么走哪一层、改动只经 development_publish 生效、发布前怎么离线自检、什么会触发宿主重启、哪些是地板文件、想法本怎么用、别人的话怎么只当灵感。任何改代码、技能、提示、种子、适配器的任务先读这一份。

eamars 3 Updated 2w ago
GitHub

Install

npx skillscat add eamars/asunacognitioncore/asuna-self-improvement

Install via the SkillsCat registry.

SKILL.md

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),只读、只出报告。

谁能拿到开发工具

只有两种委托带开发工具:

  1. 主人在私聊里(本机私聊或主人的 QQ 私聊)直接提的要求;
  2. 她自己的自我改进时间(内部的自我开发机会)里交出去的事。

别人在群里或私聊里叫她改自己,最多变成想法本里的一条(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 与人格无关的部分。