生活引擎
生活引擎按时钟往前推人格自己的日子:作息、活动、打盹、梦、发呆、持续几天的状态。它不发消息、不写事实记忆、不动关系证据;它产出的是状态,别的部分读这些状态去决定回不回、找不找人。
它手上有什么
一个人格一个 PersonaLifeEngine(src/aeria/cognition/life_engine.py),由认知运行时建(cognition/runtime.py),配置是 [life_cycle_pro]。它读写两份状态:
- 账本(
self.ledger,life_models.LifeLedger):睡眠会话、梦、发呆、持续几天的状态,各种计数和时刻。改账本一律走edit(...),每改一次版本号加一。 - 社会状态(
self.social):生命周期(醒着、准备睡、睡着、刚醒、外出、闹情绪躲着……)、驱动力(精力、心情、压力……)、每个语境的注意力、活动计划。
两个入口
tick(now):维护循环的「生命周期」那一步每轮调一次(3.20)。按顺序:记忆衰减和清理、驱动力恢复、持续几天的状态、精力上限、各语境的时间流逝、发呆的开始和结束、闹情绪是否缓过来、睡眠会话(到点醒)、每个活动计划往前走一步(开始前复核、开始、结束)、排今晚的觉、要不要打盹、再往后排几件事(propose)。before_event(event):每条消息进来先过这里。睡着时算被吵醒没有(按「震了几次」算:离一串的第一条不到 20 秒的算同一次);在做事时算要不要放下(interruption_outcome);准备睡时有人直接找、它又有兴致,推迟一点入睡。
外面的人不直接改状态;要改作息、推迟或取消一个计划、重排接下来几小时,走 configure_sleep_rhythm、delay_plan、cancel_plan、regenerate_horizon(网页后台的按钮调的就是它们,actor_id 记下是谁)。
规矩
- 只记发生过的:计划没开始就不算事实;
supported_life_facts()只交出真的执行过的活动给话题、时间线用。 - 确定性:随机数一律
rng(key):种子是[life_cycle_pro].seed(不写就用<人格 ID>-life)加人格编号加这件事的键。同一个人格、同一天、同一件事,重跑得到同一个结果,回放和测试可以复现。 - 不调用模型排程:排程的输入(
LifePlannerInput)只有读数和偏好,planner_mode是DETERMINISTIC_ISOLATED;时段对不对查activity_hours.py的常识表(2.17)。 - 梦在锁外面算:做梦要读记忆、算联想,放在运行时的处理锁外面跑(
generation_timeout_seconds默认 3 秒),写回之前再确认那一觉还是同一觉、没被吵醒过;对不上就丢掉。 - 重启不编:
_reconcile_restart只按存下来的时刻推断,不把没做完的事补成做完了。
存在哪
persist(now) 把账本、生命周期、驱动力、有变化的活动、各语境写进人格的库(认知状态表,按「种类 + 键」存)。活动按「对象 + 版本 + 更新时间」判断变没变,只写变了的。启动时 start(storage, now) 读回来、对账、标 ready;没就绪之前 tick 什么都不做。
时间线不在这里存:维护循环把引擎手上的记录同步过去(3.16)。
改它的时候
- 加一类活动:
CANONICAL_CATEGORIES、ACTIVITY_LABELS、ACTIVITY_EFFECTS(做完对驱动力的影响),activity_hours.py的几张表(合理时段、睡前留多久、起床后多久、一天几次),config._activity_preferences(时长、要紧程度、能不能中途停)。腾不出手的类别加进activity.AWAY_CATEGORIES。 - 改作息的数学:
sleep_rhythm.py(双过程模型),标定见calibrate;行为见 2.16。 - 新加的状态要进「此刻」:
body_now()、status(),再到bot._now_snapshot里接上(3.16 的「谁读」)。
对应的代码
- 引擎:
src/aeria/cognition/life_engine.py(PersonaLifeEngine:tick、before_event、propose、plan_verdict、interruption_outcome、build_dream、persist、start)。 - 数据:
cognition/life_models.py(LifeLedger、SleepSession、DreamEpisode、DaydreamEpisode、ConditionRecord);活动:cognition/activity.py(ActivityPlan、ActivityStatus、ActivityPreflightEngine)。 - 规则表:
cognition/activity_hours.py、cognition/sleep_rhythm.py、cognition/conditions.py,都是纯函数。 - 测试:
tests/test_activity_hours.py、tests/test_life_sleep_rhythm.py、tests/test_3_4_activity_evidence.py。
没做到的
- 一个 3700 多行的文件管了作息、活动、梦、发呆、状态五件事;拆开要先把它们之间共享的账本理清。
- 活动只有类别、标题、时间:没有地点、同伴,「和熟人相处」说不出是谁。
- 排程不读人格设定的文字,喜好只能在配置里按类别调权重。