决策记录和结果码
每一轮的结局记在哪、归到哪一层、后台怎么印成中文;加一种新结局要改哪几处。认知内核还有一套更细的记录(候选做法、分数、护栏、事后复盘),给观测台和回放用。
行为层面的讲法见 2.3。
两张表
decision_traces:每一轮一条。服务器、频道、触发消息、谁说的、对话阶段、本地打分和门槛、理由码、当时的群聊氛围、结局码、规划器给的一句理由、场景标签、耗时。走完打分的那一轮由bot.py的_record_decision_trace写;中途停下的(执行授权被拦、排着的行为过时了、重新规划以后不回)由_record_silence写,不让「为什么没回」查不到。每个服务器只留最近 5000 条。nhcx_decisions:认知内核的每一次决定。事件、语境、状态快照的版本、用的策略、候选做法的指纹、被护栏拦下的账、特征、路由、意外程度、元评估,最后实际怎么收尾(actual_outcome)。决策核心本身见 3.13。
结局码归层
src/aeria/cognition/decision_layers.py 里三张表:
OUTCOME_LAYERS:结局码 → 八层之一(硬规则、有没有空、群聊过滤、模型、节奏、把关、技术原因、说出去了);OUTCOME_LABELS:结局码 → 后台上印的中文;ACTION_LABELS:认知内核的十四种做法 → 中文。
decision_layer(outcome, reasons):固定的码查表;认知内核记的 nhcx_<做法>(以及 observed、pending)看理由码的前缀:PERMISSION.、PRIVACY.、SAFETY.、RISK.、TOOL.、POLICY.、GUARD.、EXECUTION. 这些归硬规则;LIFECYCLE.、LIFE.、ACTIVITY.、SLEEP.、BOUNDARY. 归有没有空;其余归群聊过滤。什么都对不上的归技术原因。主动联系收尾时写的 follow_up_*、proactive_* 各十三种也登记在这里。
加一种结局
- 在
src/aeria/bot.py里用_record_decision_trace或_record_silence记下新的结局码。 - 在
decision_layers.py的OUTCOME_LAYERS、OUTCOME_LABELS各加一行:层只能是那八层之一,中文名不能留英文。 - 跑
tests/test_decision_authority.py。「代码里用到的每个结果码都归了层」会扫bot.py里这两个函数后面的一段,认得的前缀写在测试的正则里(silent_、planner_、replan_……):新码用了新前缀,要把前缀加进正则,不然它扫不到,也就拦不住漏登记。
后台怎么拿
GET /api/decisions?guild_id=<服务器>(读权限):
traces:最近的决策记录,每条带layer、layer_label、outcome_label;nhcx_traces:这个服务器里认知内核的轨迹;消息正文只给所有者(include_body);statistics、summary:近 24 小时,结局的中文名由_label_outcomes填;layers:近 24 小时每层停了几轮(storage.decision_layer_counts)。
页面在 webui_frontend/src/routes/Decisions.tsx(「决策记录」);认知观测台、事件流、人格状态、回放实验室、事后复盘在 CognitionLab.tsx。
观测、回放、复盘
- 轨迹:
src/aeria/cognition/observatory.py的CognitiveTrace:事件、感知、状态、预测、意外、各位专家的提议、候选、约束、路由、最后的行为、理由码、测量、实际结局、复盘。只放看得见的输入、分数、约束和结果,不放模型的思考过程,也不带任何执行权。 - 回放:
POST /api/nhcx/replay(只给所有者):拿一条历史事件,换随机种子、换 A / B 变体、改状态或改消息,重新算一遍内核会选什么。结果标着SIMULATION、事实权重 0,什么都不执行。 - 复盘:
src/aeria/cognition/retrospective.py的RetrospectiveReviewer:一轮执行完以后,按规则(不调模型)给它挑毛病:回得太长、太殷勤、重复、时机不对、把自己的状态说得太直白……一共五十种类别。GET /api/nhcx/retrospective列出来。复盘不改这一轮已经发出去的话。
没做到的
decision_traces按服务器存、按服务器查:私聊的那几轮(服务器为空)在后台页面上看不到。- 复盘是规则,只认得登记过的那几十种毛病;新的毛病要先有人看出来,再加一条规则。
- 「有没有空」那一层停下的轮次,结局写的是内核选的做法;没空的原因在理由码里,要点开那一轮看。