/**
 * benchmark-learning-curve.ts — AAM 学习曲线基准测试
 *
 * 测试 AAM 的召回质量如何随消息数量增长而提升。
 * 生成 1,200 条模拟用户消息（12 领域 × 100 条），增量喂入 AAM，
 * 在 10 个检查点暂停，用 40 条固定查询测试召回质量。
 *
 * 用法：npx tsx cc-soul/benchmark-learning-curve.ts
 */

import { createRequire } from 'module'
import { fileURLToPath } from 'url'

// ESM 环境下注入 require（activation-field.ts 内部有 12 处 require 需要它）
const _require = createRequire(import.meta.url)
;(globalThis as any).require = _require

import type { Memory } from './types.ts'
import { learnAssociation, getAAMStats } from './aam.ts'
import { activationRecall } from './activation-field.ts'

// ═══════════════════════════════════════════════════════════════════════════════
// 12 DOMAINS × 100 MESSAGES (4 phases)
// ═══════════════════════════════════════════════════════════════════════════════

interface DomainDef {
  name: string
  phase1: string[] // 1-30: basic facts
  phase2: string[] // 31-60: preferences
  phase3: string[] // 61-80: emotional
  phase4: string[] // 81-100: cross-domain
}

const DOMAINS: DomainDef[] = [
  {
    name: '工作',
    phase1: [
      '我在字节跳动工作', '我是后端开发', '我们组有8个人', '我的工位在A栋3楼',
      '我们组做推荐系统', '我入职三年了', '我的leader是李明', '我们用Go语言',
      '我每天9点半上班', '工作日一般6点半下班', '我们有每日站会', '我在北京望京办公',
      '公司提供免费午餐', '我的title是senior engineer', '我们组归属于技术部',
      '公司有期权', '我的直属上级很好', '我们用飞书沟通', '我参加了公司的技术委员会',
      '我负责用户画像模块', '我们的系统QPS大概5万', '公司每年有两次调薪',
      '我的工号是BY20230456', '我们组有三个前端', '团队氛围不错',
      '公司在字节跳动大厦', '我每天通勤一小时', '我有一个mentor是王涛',
      '我们用Kubernetes部署', '公司有内部技术分享',
    ],
    phase2: [
      '我喜欢远程办公', '我觉得公司福利不错', '我比较适应小团队', '我喜欢做架构设计',
      '我不太喜欢写文档', '我觉得字节的工作节奏太快', '我喜欢参加技术分享',
      '我觉得Go语言写起来效率很高', '我喜欢做系统优化', '我觉得推荐系统很有趣',
      '我偏好异步沟通', '比起前端我更喜欢后端', '我喜欢做性能调优',
      '我觉得站会挺有用的', '我偏好用命令行而不是IDE', '我喜欢mentor制度',
      '我觉得双周sprint比较合理', '我喜欢code review', '我偏好写单元测试',
      '我觉得线上值班制度不错', '我喜欢跨团队合作', '我觉得技术委员会能学到东西',
      '我比较看重技术成长', '我不太喜欢做管理', '我觉得开源项目很有意义',
      '我偏好Linux开发环境', '我喜欢用Vim', '我觉得敏捷开发比瀑布好',
      '我喜欢做技术选型', '我觉得好的API设计很重要',
    ],
    phase3: [
      '今天被领导批了心情很差', '加班到11点累死了', '项目延期压力好大',
      '线上出了个P0事故我慌了', '被要求周末加班特别不爽', '这个需求改了五遍崩溃了',
      '升职没我心里很不平衡', '同事离职了有点伤感', '写了一天bug特别烦躁',
      '今天demo很成功超开心', '终于把那个棘手的bug修好了', '性能优化有了突破进展很兴奋',
      '被client投诉了心里委屈', '年终奖比预期少了很失望', '新来的实习生特别聪明',
      '代码被全盘推翻重写很郁闷', '今天的技术分享反馈很好', '项目上线后睡了个好觉',
      '又要接手烂代码很头疼', '组里多了三个需求人手不够',
    ],
    phase4: [
      '加班太多想换工作', '考虑去阿里面试', '工作压力大导致失眠',
      '想考个AWS认证提升竞争力', '打算攒够钱就辞职创业',
      '工作忙没时间陪孩子很愧疚', '想换到杭州工作离家近',
      '同事推荐我去看心理咨询', '工作太累周末只想躺着', '公司团建去了云南',
      '升职加薪了决定买辆车', '工作认识了很多厉害的朋友',
      '考虑转做技术管理', '打算业余时间做开源',
      '工作太忙把健身搁置了', '打算存够首付在北京买房',
      '工作之余在学Rust', '想请假去旅游放松一下',
      '年底冲刺天天吃外卖', '项目做完打算好好休息',
    ],
  },
  {
    name: '技术',
    phase1: [
      '我主要写Go和Python', '我用MacBook Pro开发', '我的显示器是4K的',
      '我用Neovim写代码', '我有个GitHub账号', '我会Docker和K8s',
      '我了解Redis和MySQL', '我读过DDIA这本书', '我用过TensorFlow',
      '我搭过自己的HomeLab', '我对分布式系统感兴趣', '我写过gRPC服务',
      '我用过ELK做日志', '我了解Kafka消息队列', '我写过CI/CD流水线',
      '我有个树莓派做NAS', '我用Zsh加Oh-My-Zsh', '我的dotfiles在GitHub上',
      '我平时看Hacker News', '我订阅了几个技术播客',
      '我读过Go语言圣经', '我了解eBPF', '我用过Prometheus监控',
      '我做过微服务拆分', '我了解CAP定理', '我写过LeetCode',
      '我参加过开源之夏', '我了解WebAssembly', '我用过GraphQL', '我学过Raft协议',
    ],
    phase2: [
      '我觉得Go的错误处理不太优雅', '我喜欢Rust的所有权概念', '我偏好函数式编程',
      '我觉得TypeScript比JavaScript好', '我喜欢用终端而不是GUI', '我觉得K8s太复杂了',
      '我偏好PostgreSQL胜过MySQL', '我觉得微服务不一定比单体好',
      '我喜欢写CLI工具', '我觉得GraphQL比REST好用', '我偏好Vim快捷键',
      '我觉得Docker改变了开发方式', '我喜欢写底层系统代码', '我觉得LLM会改变编程',
      '我偏好静态类型语言', '我觉得代码可读性比性能重要', '我喜欢写文档生成器',
      '我觉得单元测试很有必要', '我偏好事件驱动架构', '我觉得Serverless适合小项目',
      '我喜欢用Markdown写笔记', '我觉得Git是最好的版本控制', '我偏好命令行git而不是GUI',
      '我觉得AI辅助编程会越来越重要', '我喜欢看技术博客', '我觉得开源社区很棒',
      '我偏好小而精的库', '我觉得抽象泄漏是工程大敌', '我喜欢做性能benchmark',
      '我觉得好的报错信息很重要',
    ],
    phase3: [
      '线上数据库挂了两小时太吓人了', '花了三天排查一个死锁问题好崩溃',
      '新技术栈学不完好焦虑', '终于把延迟从200ms降到20ms超爽',
      '开源PR被merge了好开心', '被黑客攻击了一晚上没睡处理安全事件',
      '写了一个月的功能被砍了好郁闷', '技术分享讲砸了好尴尬',
      '发现了一个优雅的解决方案很兴奋', '遇到一个诡异的并发bug快疯了',
      '升级依赖导致线上回滚很紧张', '用新框架重写了旧系统效率提升了3倍',
      '代码审查发现了一个严重安全漏洞', '参加黑客马拉松拿了第二名',
      '学Rust一个月终于能写了', '数据迁移成功了松了一口气',
      '技术债太多了每次改代码都提心吊胆', 'K8s集群OOM了排查了一天',
      '终于理解了eBPF的工作原理', '搭好了完整的监控体系很有成就感',
    ],
    phase4: [
      '想辞职全职做开源', '技术太卷了想转行', '在考虑要不要出国读CS PhD',
      '攒钱买了台M4 Mac Pro', '技术焦虑导致睡不好觉', '打算写技术博客增加影响力',
      '想去参加GoConf', '技术好了想带团队', '在GitHub上认识了很多厉害的人',
      '考虑做个独立开发者', '想用AI做个副业项目', '技术学太多影响了和家人的时间',
      '打算考个GCP认证', '想写一本Go语言的书', '技术社区里交了几个好朋友',
      '学编程让我养成了逻辑思维', '想做个开源记忆系统', '技术面试太难了得刷题',
      '想搞个技术自媒体', '考虑转做AI方向',
    ],
  },
  {
    name: '家庭',
    phase1: [
      '我已婚有一个儿子', '我儿子今年3岁', '我老婆是医生', '我爸妈在老家苏州',
      '我岳父岳母住在合肥', '我老婆在三甲医院工作', '我们住在朝阳区', '儿子在上幼儿园',
      '我爸退休了', '我妈是老师退休的', '我有一个姐姐在上海', '我姐已经结婚了',
      '我侄女今年5岁', '我家有只橘猫叫橘子', '我们住的是两居室',
      '我老婆比我小两岁', '我爸喜欢钓鱼', '我妈喜欢跳广场舞',
      '我们2020年结的婚', '儿子叫小豆', '我老婆叫苏晴', '我们房子是贷款买的',
      '我姐夫是程序员', '我们家阿姨每周来两次', '我们养了两年的橘猫',
      '我老婆值夜班比较辛苦', '儿子最喜欢看小猪佩奇', '我们周末经常带孩子去公园',
      '我爸妈春节会来北京', '家里有台扫地机器人',
    ],
    phase2: [
      '我很重视家庭陪伴', '我觉得教育不能太卷', '我喜欢带孩子户外活动',
      '我不想让儿子太早学英语', '我偏好自己做饭不点外卖', '我觉得住郊区也不错',
      '我喜欢周末全家出去玩', '我不想让父母太操心', '我觉得猫比狗好养',
      '我喜欢陪儿子搭乐高', '我觉得孩子的想象力最重要', '我偏好公立幼儿园',
      '我觉得夫妻之间沟通很重要', '我喜欢和老婆一起看电影', '我觉得隔代教育容易有矛盾',
      '我想给儿子一个快乐的童年', '我偏好让孩子多运动', '我觉得周末应该属于家人',
      '我喜欢带猫出去遛', '我觉得生活不能只有工作', '我想多陪陪父母',
      '我偏好全家一起吃晚饭', '我觉得孩子应该早睡', '我喜欢讲睡前故事给儿子听',
      '我觉得家庭氛围最重要', '我不想给孩子报太多兴趣班', '我喜欢假期回苏州老家',
      '我觉得家人健康比什么都重要', '我偏好周末在家做饭', '我觉得亲子时间不能少',
    ],
    phase3: [
      '儿子生病了好担心', '和老婆因为教育理念吵架了', '父母身体不好回不了老家很愧疚',
      '看到儿子叫爸爸特别感动', '搬新家全家都很开心', '猫走丢了一天急死了',
      '儿子第一天上幼儿园哭了我也想哭', '全家一起去了迪士尼超开心',
      '岳母住院了老婆很焦虑', '儿子画了一幅画送我感动哭了',
      '和老婆冷战了三天很难受', '过年全家团聚特别温暖',
      '房贷涨了压力好大', '儿子在幼儿园被欺负了心疼',
      '老婆升职了我们出去庆祝', '猫生了一窝小猫好惊喜',
      '姐姐结婚我特别开心', '父亲节收到儿子的礼物', '和父母视频他们头发白了好多',
      '全家一起种了花周末心情好',
    ],
    phase4: [
      '想把父母接到北京住', '儿子要上小学了在研究学区房', '老婆考虑辞职全职带娃',
      '打算存钱给儿子上国际学校', '家庭开支增加了在研究理财',
      '想换个三居室但房贷压力大', '儿子开始学钢琴了', '带全家去日本旅游',
      '考虑买辆新能源车方便全家出行', '岳母退休了来北京帮忙带孩子',
      '老婆工作太忙我们轮流做饭', '打算暑假带儿子去学游泳',
      '要不要让儿子学编程在考虑', '姐姐一家搬来了北京更热闹了',
      '家里准备装修需要存钱', '全家体检安排上了', '打算养第二只猫',
      '考虑让儿子去学武术强身健体', '周末打算全家爬山', '春节准备带全家去三亚',
    ],
  },
  {
    name: '健康',
    phase1: [
      '我身高178体重75公斤', '我有轻微近视350度', '我的血压偏高130/90',
      '我的血型是A型', '我对花粉过敏', '我有过腰椎间盘突出', '我每年体检一次',
      '我的胆固醇偏高', '我不抽烟', '我偶尔喝点啤酒', '我有慢性胃炎',
      '我做过阑尾炎手术', '我的BMI是23.7', '我每天睡6-7小时',
      '我牙齿做过根管治疗', '我有肩周炎', '我的视力在慢慢下降',
      '我家族有高血压遗传', '我的心率偏快平时80多', '我缺维生素D',
      '我的尿酸偏高', '我有痔疮', '我的甲状腺指标正常', '我最近体检肝功能正常',
      '我的血糖正常', '我有轻微脂肪肝', '我以前得过带状疱疹',
      '我做过近视激光手术', '我的免疫力一般', '我冬天容易感冒',
    ],
    phase2: [
      '我在减肥想降到70公斤', '我偏好中医调理', '我觉得运动比吃药好',
      '我喜欢晨跑', '我觉得睡眠质量比时长重要', '我偏好自然食疗',
      '我觉得心理健康和身体健康一样重要', '我喜欢泡脚养生', '我觉得少坐多走很重要',
      '我偏好有机食品', '我觉得定期体检很有必要', '我喜欢做瑜伽放松',
      '我偏好喝白开水不喝饮料', '我觉得戒酒对身体好', '我喜欢按摩缓解肩膀',
      '我觉得冥想对心理有帮助', '我偏好早睡早起', '我觉得控制饮食比运动更重要',
      '我喜欢周末去爬山', '我觉得眼睛要注意保护', '我偏好中药而不是西药',
      '我觉得压力管理很重要', '我喜欢喝绿茶', '我觉得牙齿保健要从小做起',
      '我偏好看中医', '我觉得泡温泉对身体好', '我喜欢做拉伸运动',
      '我觉得定期洗牙很有必要', '我偏好清淡饮食', '我觉得午休能提高效率',
    ],
    phase3: [
      '今天跑了10公里感觉超好', '腰又犯了疼得直不起来', '体检报告出来血脂高了好担心',
      '减肥成功瘦了3公斤好开心', '熬夜加班第二天头疼欲裂', '去看中医被说湿气重',
      '过敏犯了眼睛痒得不行', '做了胃镜有点紧张但结果还好', '失眠了好几天精神很差',
      '终于戒了奶茶一个月', '肩膀疼去做了推拿舒服多了', '跑马拉松跑完膝盖疼',
      '感冒了一周还没好', '血压降下来了医生很满意', '尿酸高了不能吃海鲜好可惜',
      '做了个小手术住了两天院', '开始练习冥想感觉不错', '体重又反弹了好沮丧',
      '牙疼了一晚上没睡好', '年度体检一切正常好开心',
    ],
    phase4: [
      '工作压力太大导致胃炎复发', '想报个健身房认真锻炼', '打算每天走1万步',
      '健康问题让我考虑换个轻松的工作', '要控制饮食降血脂', '打算去日本体检',
      '想买个按摩椅放在家里', '医生建议我多休息少加班', '打算学太极拳养生',
      '健康问题花了不少钱要注意理财', '带全家去体检', '想养成早睡的习惯',
      '同事推荐了个好的中医', '打算减少外卖改自己做饭', '体检后打算重新规划作息',
      '想陪儿子一起运动', '考虑买份重疾险', '打算戒烟戒酒',
      '想找个营养师规划饮食', '健康是第一位的打算少加班',
    ],
  },
  {
    name: '财务',
    phase1: [
      '我月薪大概4万', '我有一套房还在还贷', '房贷每月1万2', '我有20万存款',
      '我买了一些基金', '我有两张信用卡', '我没有车贷', '我交了五险一金',
      '我每月给父母5000', '我有个股票账户', '我的公积金每月6000',
      '我买了商业医疗保险', '我的年终奖大概3个月', '我每月花销大概2万',
      '我用的招商银行', '我有30万的基金投资', '我没有外债', '我每月能存1万',
      '我有一张白金信用卡', '我买了重疾险', '我的房子首付是家里帮忙出的',
      '我还有15年的房贷', '我投了一点比特币', '我有个记账的习惯',
      '我的个税每月大概5000', '我公司有期权还没行权', '我的支付宝余额有3万',
      '我老婆月薪大概2万', '家庭月收入大概6万', '我有一份理财保险',
    ],
    phase2: [
      '我偏好稳健投资', '我觉得基金定投比较靠谱', '我不喜欢炒短线股票',
      '我觉得房产投资不如以前了', '我偏好存款而不是投资', '我觉得保险很重要',
      '我不喜欢借钱消费', '我觉得理财要趁早', '我偏好指数基金',
      '我觉得记账能帮助控制支出', '我不想太多负债', '我觉得应急基金很重要',
      '我偏好长期投资', '我觉得税务规划很重要', '我不喜欢奢侈品',
      '我觉得教育投资值得', '我偏好数字化记账', '我觉得多元配置比较安全',
      '我不想炒期货太危险', '我觉得副业收入很重要', '我偏好低风险理财',
      '我觉得通货膨胀要对冲', '我不喜欢月光族生活', '我觉得财务自由很重要',
      '我偏好自动化投资', '我觉得消费降级也是一种智慧', '我不想做P2P投资',
      '我觉得黄金可以配置一点', '我偏好定期储蓄', '我觉得家庭资产配置很重要',
    ],
    phase3: [
      '股票跌了好心疼', '发了年终奖好开心', '房贷利率降了省了点钱',
      '信用卡被盗刷了好慌', '基金收益不错很满意', '被朋友借钱不还很郁闷',
      '攒够了一年的应急基金安心了', '看到同事买了豪车有点羡慕',
      '公司发了期权很期待', '交完税心好痛', '终于还完了车贷',
      '投资亏了2万有点后悔', '老婆升职收入增加了', '记账后发现外卖花了太多钱',
      '朋友推荐了个理财产品犹豫要不要买', '房租涨了压力增大', '双十一花了太多冲动消费',
      '收到了退税好开心', '孩子的教育费用比预期高', '终于把外债都还清了',
    ],
    phase4: [
      '想辞职创业但怕经济压力', '打算换个学区房但要增加贷款', '考虑做一些副业增加收入',
      '健康问题花了不少需要调整预算', '打算给孩子存教育基金', '想出国旅游但要控制预算',
      '考虑提前还房贷', '工作不顺在考虑跳槽涨薪', '打算学理财课程',
      '想给父母买份养老保险', '考虑投资一个朋友的创业项目', '打算换辆新能源车',
      '想买一份教育年金', '考虑在杭州买第二套房投资', '打算优化家庭保险配置',
      '想做个家庭财务规划', '考虑把期权行权', '打算开始定投纳斯达克指数',
      '想存钱去读MBA', '考虑注册一个公司做副业',
    ],
  },
  {
    name: '饮食',
    phase1: [
      '我喜欢吃川菜', '我每天早上喝咖啡', '我午饭一般在公司食堂', '我不吃香菜',
      '我爱吃火锅', '我每周至少做两次饭', '我喝美式不加糖', '我喜欢喝绿茶',
      '我不吃辣', '我习惯晚上8点前吃晚饭', '我经常点外卖', '我喜欢吃海鲜',
      '我不喝碳酸饮料', '我每天吃水果', '我喜欢吃面条', '我早餐一般吃鸡蛋和面包',
      '我不吃内脏', '我爱吃日料', '我喜欢喝酸奶', '我不太吃零食',
      '我喜欢吃牛肉', '我每天喝八杯水', '我喜欢吃烧烤', '我偶尔吃火锅底料煮面',
      '我不吃芹菜', '我爱喝椰子水', '我喜欢吃水煮鱼', '我每周做一次烘焙',
      '我喜欢吃草莓', '我常喝枸杞泡水',
    ],
    phase2: [
      '我在减肥控制碳水', '我偏好清淡口味', '我觉得自己做饭比外卖健康',
      '我喜欢尝试新的菜谱', '我觉得早餐很重要', '我偏好全谷物主食',
      '我觉得少吃外卖比较好', '我喜欢去尝试新开的餐厅', '我偏好蒸煮而不是油炸',
      '我觉得吃饭要定时', '我喜欢看美食博主学做菜', '我偏好植物蛋白',
      '我觉得零食是减肥大敌', '我喜欢周末去逛菜市场', '我偏好有机蔬菜',
      '我觉得中餐比西餐好吃', '我喜欢自制饮料', '我偏好低糖低脂',
      '我觉得吃饭不能太快', '我喜欢研究营养搭配', '我偏好时令水果',
      '我觉得喝汤对身体好', '我喜欢做减脂餐', '我偏好少油少盐',
      '我觉得食材新鲜最重要', '我喜欢囤冷冻食品', '我偏好地中海饮食',
      '我觉得蛋白质很重要', '我喜欢吃沙拉', '我偏好粗粮',
    ],
    phase3: [
      '今天做了一顿超好吃的饭很有成就感', '外卖吃坏肚子了好难受', '减肥忍不住吃了火锅好罪恶',
      '发现一家超好吃的日料店', '连续吃了一周外卖感觉身体在抗议', '自制的蛋糕被老婆夸了',
      '吃了过期食品拉肚子了', '尝试了生酮饮食效果不错', '忙到忘了吃午饭',
      '带儿子做了曲奇他很开心', '戒咖啡第三天头疼难受', '和朋友去吃了自助太撑了',
      '菜市场买到了超新鲜的海鲜', '做饭切到手了流了好多血', '找到了一家不错的沙拉店',
      '控制饮食一个月瘦了2公斤好开心', '同事带了自制便当看着好羡慕',
      '晚上暴食了好后悔', '今天煲了个汤全家都喜欢', '发现了一个好用的减脂食谱App',
    ],
    phase4: [
      '减肥要控制饮食和运动结合', '在考虑学做西餐', '饮食不规律导致胃不舒服',
      '想开一家小餐厅是我的梦想', '打算每天带便当上班省钱又健康',
      '儿子不爱吃蔬菜要想办法', '想买一台烤箱做烘焙', '打算戒掉外卖习惯',
      '想学做日料给老婆惊喜', '饮食习惯改变后精力好了很多',
      '考虑找个营养师制定食谱', '想去上一个烹饪课',
      '打算在家种一些蔬菜', '想减少咖啡因摄入', '考虑尝试间歇性断食',
      '打算给儿子做营养均衡的便当', '想买个破壁机做果蔬汁',
      '考虑跟同事一起团购有机菜', '饮食清淡后睡眠改善了', '打算写一个家庭食谱本',
    ],
  },
  {
    name: '情绪',
    phase1: [
      '我是个偏内向的人', '我容易焦虑', '我有时候会失眠', '我压力大的时候喜欢独处',
      '我小时候很怕黑', '我有社交恐惧', '我考试前会特别紧张', '我看电影容易哭',
      '我生气时会沉默', '我是个完美主义者', '我有拖延症', '我害怕公开演讲',
      '我容易感到孤独', '我有选择困难症', '我情绪波动比较大',
      '我对未来有时候会感到迷茫', '我容易被别人的情绪影响', '我有时候会自我怀疑',
      '我看到小动物就开心', '我听音乐能放松', '我压力大时爱吃甜食',
      '我喜欢安静的环境', '我和陌生人说话会紧张', '我容易心软',
      '我有被讨好型人格的倾向', '我害怕被拒绝', '我对不确定性感到焦虑',
      '我是个敏感的人', '我有时候会对自己要求太高', '我容易被负面新闻影响',
    ],
    phase2: [
      '我觉得心理健康很重要', '我偏好独处来恢复精力', '我觉得冥想对心理有帮助',
      '我喜欢通过运动释放压力', '我觉得写日记能梳理情绪', '我偏好少刷社交媒体',
      '我觉得倾诉比憋着好', '我喜欢听轻音乐放松', '我觉得接受不完美很重要',
      '我偏好面对面沟通而不是文字', '我觉得情绪管理是一项技能', '我喜欢看心理学书籍',
      '我觉得要学会说不', '我偏好规律作息来稳定情绪', '我觉得正念练习有帮助',
      '我喜欢通过画画表达情绪', '我觉得有边界感很重要', '我偏好小群体社交',
      '我觉得感恩能提升幸福感', '我喜欢大自然能让我平静', '我觉得自我接纳是第一步',
      '我偏好慢节奏的生活', '我觉得不要过度在意别人看法', '我喜欢写感恩日记',
      '我觉得适当放空很重要', '我偏好深度交流而不是泛泛之交', '我觉得哭出来会好受些',
      '我喜欢被猫治愈', '我觉得要允许自己不开心', '我偏好用行动缓解焦虑',
    ],
    phase3: [
      '今天心情特别低落什么都不想做', '和好朋友聊完天心情好多了', '焦虑到手在抖',
      '看了一部电影哭了很久但释放了', '失眠到凌晨三点太痛苦了', '今天冥想了30分钟很平静',
      '被同事误解了好委屈', '完成了一个挑战信心增加了', '社交恐惧让我错过了一次好机会',
      '阳光明媚心情突然变好了', '和老婆吵架后一个人在外面走了很久',
      '看到儿子的笑脸什么烦恼都没了', '压力大到胃疼', '终于鼓起勇气做了一件害怕的事',
      '被表扬了好开心难得', '季节变化情绪也跟着波动', '写了长长的日记感觉好多了',
      '拖延了一个月的事终于做完了松了一口气', '听到了一个坏消息一整天都很低落',
      '和陌生人聊天居然很愉快',
    ],
    phase4: [
      '焦虑影响工作效率想去看心理医生', '情绪不好导致暴食体重增加', '打算开始系统学习情绪管理',
      '想报一个冥想课程', '情绪波动影响了和老婆的关系', '打算减少社交媒体使用',
      '考虑找个心理咨询师', '想通过运动来改善心理状态', '情绪低落时不想出门社交',
      '打算培养一个让自己放松的爱好', '想学正念减压', '情绪问题让我重新审视生活节奏',
      '打算每天花10分钟冥想', '想去参加心理成长工作坊', '考虑养一只猫做情感陪伴',
      '打算写一本关于情绪管理的笔记', '想找志同道合的人组成互助小组',
      '情绪稳定后工作效率高了很多', '打算把冥想变成日常习惯', '想和老婆一起学沟通技巧',
    ],
  },
  {
    name: '社交',
    phase1: [
      '我最好的朋友叫张伟', '张伟是我大学室友', '我有一个闺蜜团5个人',
      '我的前同事老王经常联系', '我在一个技术社群里', '我不太爱参加大型聚会',
      '我每周和张伟打一次球', '我的大学同学在全国各地', '我有个邻居叫陈姐人很好',
      '我参加了一个读书会', '我不喜欢应酬', '我有几个网友认识好多年了',
      '我和同事关系一般', '我在公司没有特别亲的人', '我和初中同学基本断联了',
      '我有个发小叫李勇', '我参加了一个跑步俱乐部', '我和张伟认识十年了',
      '我不太用朋友圈', '我有个技术导师叫王老师', '我的社交圈比较小',
      '我和姐姐的关系很好', '我不太擅长维护关系', '我每月和闺蜜团聚一次',
      '我在GitHub上认识了一些国外开发者', '我和前女友还是朋友',
      '我参加了校友会', '我的邻居们都很友善', '我不喜欢无意义的社交',
      '我和同事周末偶尔聚餐',
    ],
    phase2: [
      '我偏好小圈子深度社交', '我觉得真诚是交友的基础', '我喜欢和聊得来的人待在一起',
      '我不喜欢虚伪的社交场合', '我觉得知己两三个就够了', '我偏好线下见面而不是网聊',
      '我觉得朋友之间要保持适当距离', '我喜欢和有趣的人交流', '我觉得人际关系需要用心维护',
      '我不喜欢八卦', '我偏好有共同爱好的社交', '我觉得同事关系保持专业就好',
      '我喜欢请朋友来家里吃饭', '我觉得不必刻意讨好谁', '我偏好安静的社交场合',
      '我觉得能聊技术的朋友最好', '我喜欢和朋友一起运动', '我觉得社交不必太频繁',
      '我偏好深度对话', '我觉得朋友之间不要谈钱', '我喜欢参加技术meetup',
      '我觉得志同道合最重要', '我偏好一对一交流', '我觉得网络社交有时候太虚了',
      '我喜欢和有正能量的人在一起', '我觉得真正的朋友不需要天天联系',
      '我偏好有边界的友谊', '我觉得倾听比说话重要', '我喜欢偶尔一个人独处',
      '我觉得社交能力可以培养',
    ],
    phase3: [
      '和张伟聊了一晚上心情好多了', '被好朋友背叛了很受伤', '同事聚会气氛很好',
      '社恐在大群里发言紧张到手抖', '读书会认识了一个很合拍的人', '被朋友放鸽子了不开心',
      '和陈姐聊天感觉很温暖', '和前同事老王喝酒聊到凌晨', '参加技术meetup收获很大',
      '闺蜜团聚会笑了一整晚', '被同事在背后说坏话心里不舒服',
      '在跑步俱乐部交了新朋友', '和大学同学重聚特别感动', '朋友有困难我帮了忙感觉很好',
      '网友线下见面和想象的一样好', '和邻居发生了小摩擦有点不愉快',
      '校友会上见到了老同学', '被朋友突然疏远了不知道为什么', '和技术社群的人一起做了开源项目',
      '帮张伟搬家累但开心',
    ],
    phase4: [
      '想扩展社交圈但社恐犯了', '搬家后需要重新认识邻居', '工作太忙疏忽了和朋友联系',
      '想组织一次大学同学聚会', '社交焦虑想去做心理咨询', '打算多参加线下技术活动',
      '想和张伟一起创业', '考虑加入一个志愿者组织', '想带家人和朋友家庭一起出游',
      '打算请同事来家里吃饭增进关系', '想减少无效社交把时间留给重要的人',
      '考虑办一个小型技术沙龙', '想找到一些有共同爱好的新朋友',
      '打算和读书会的朋友一起去旅行', '想帮张伟介绍一份好工作',
      '考虑搞一个固定的周末聚会', '想通过开源认识更多国际开发者',
      '打算和老婆一起参加夫妻社交活动', '想和闺蜜团一起去旅行',
      '打算主动联系久未联系的朋友',
    ],
  },
  {
    name: '出行',
    phase1: [
      '我住在北京朝阳区', '我每天坐地铁上班', '我有一辆特斯拉Model 3',
      '我上班走10号线', '通勤单程大概50分钟', '我周末开车出去', '我有驾照',
      '我去年出差去了上海', '我坐过高铁去杭州', '我喜欢自驾游',
      '我的车是白色的', '我平时打车用滴滴', '我有一张京津冀一卡通',
      '我停车位在地下二层', '公司有班车但我不坐', '我的通勤路线要换乘一次',
      '我没有摩托车', '我偶尔骑共享单车', '我的车保养在特斯拉直营店',
      '我不太喜欢坐飞机', '我的ETC已经办了', '我的驾照是C1',
      '我开车比较稳', '我不喜欢堵车', '我上次出差坐了高铁一等座',
      '我的车买了全险', '我每年开大概1万公里', '我的车充电桩在小区车库',
      '我打算明年换胎', '公司离家15公里',
    ],
    phase2: [
      '我喜欢自驾游去看风景', '我偏好高铁不喜欢飞机', '我觉得新能源车省钱',
      '我喜欢地铁的准时性', '我觉得北京堵车太严重了', '我偏好错峰出行',
      '我觉得共享单车很方便', '我喜欢自驾去郊区', '我偏好一等座',
      '我觉得通勤时间不能太长', '我喜欢road trip', '我偏好小众景点',
      '我觉得特斯拉的自动驾驶不错', '我喜欢开夜车', '我偏好不转机的航班',
      '我觉得出差住酒店不如民宿', '我喜欢去新的城市探索', '我偏好淡季出游',
      '我觉得做攻略是旅行的一部分', '我喜欢自由行不跟团', '我偏好海岛度假',
      '我觉得行李越少越好', '我喜欢在火车上看书', '我偏好短途旅行',
      '我觉得交通便利是选房的重要因素', '我喜欢带孩子坐火车', '我偏好开车不打车',
      '我觉得出行前要做好规划', '我喜欢公路旅行', '我偏好慢旅行',
    ],
    phase3: [
      '堵了两个小时心态崩了', '自驾去了趟草原太爽了', '飞机延误了3小时好烦',
      '第一次自驾长途有点紧张', '发现了一条避开拥堵的小路', '车被刮了好心疼',
      '坐高铁看风景心情大好', '下雨天打不到车急死了', '带全家自驾去了青岛玩得很开心',
      '在地铁上被挤得无法呼吸', '终于提了新车超兴奋', '出差飞了三个城市累坏了',
      '骑共享单车摔了一跤', '通勤路上遇到了演出堵了好久', '自驾游遇到暴雨很害怕',
      '换了条通勤路线省了20分钟', '车的续航在冬天掉太快了', '坐地铁遇到了好心人帮忙',
      '出差回来在高铁上睡着了', '停车找了半小时车位',
    ],
    phase4: [
      '打算暑假带全家自驾去云南', '考虑换一辆续航更长的车', '通勤太累想搬到公司附近',
      '打算国庆去日本旅游', '想买一辆电动自行车通勤', '考虑办一张航空公司的会员卡',
      '想带父母去三亚度假', '打算学开山路为自驾准备', '考虑搬到离地铁更近的小区',
      '想和张伟一起自驾去西藏', '打算春节开车回苏州老家', '考虑买一辆摩托车周末骑',
      '想去欧洲自驾游', '打算给车装一个行车记录仪', '考虑搬家减少通勤时间',
      '想带儿子坐一次飞机', '打算明年带全家出国旅游', '考虑办一张ETC全国通',
      '想在周末探索北京周边', '打算制定一个年度旅行计划',
    ],
  },
  {
    name: '娱乐',
    phase1: [
      '我喜欢看科幻电影', '我最喜欢的导演是诺兰', '我在追一部韩剧',
      '我每周打两次篮球', '我有个Switch', '我喜欢听摇滚乐',
      '我最近在看三体', '我有个Spotify会员', '我经常看B站',
      '我喜欢看脱口秀', '我会弹一点吉他', '我每周跑步三次',
      '我喜欢拍照', '我有一台索尼相机', '我玩过塞尔达传说',
      '我喜欢看NBA', '我支持湖人队', '我看过星际穿越五遍',
      '我喜欢去live house', '我有个B站号偶尔发视频', '我看漫画看了很多年',
      '我喜欢黑色幽默的电影', '我最近在听周杰伦', '我玩过原神',
      '我喜欢徒步', '我有一双跑步鞋', '我看美剧比较多', '我喜欢打桌游',
      '我有一个豆瓣账号', '我最近迷上了飞盘',
    ],
    phase2: [
      '我觉得科幻片比爱情片有深度', '我偏好独自看电影', '我觉得好的音乐能治愈心灵',
      '我喜欢周末去打球放松', '我觉得游戏是一种艺术', '我偏好独立音乐',
      '我觉得阅读比刷短视频有意义', '我喜欢边跑步边听播客', '我偏好画质好的大屏看电影',
      '我觉得B站的内容质量不错', '我喜欢去小众的live house', '我偏好策略类游戏',
      '我觉得运动是最好的减压方式', '我喜欢去展览和博物馆', '我偏好看评分高的电影',
      '我觉得摄影能培养审美', '我喜欢和朋友一起打桌游', '我偏好室外运动',
      '我觉得脱口秀是当代最好的喜剧形式', '我喜欢看长评而不是短评',
      '我偏好有深度的纪录片', '我觉得现场音乐比录音好一百倍', '我喜欢看幕后制作花絮',
      '我偏好非竞技性运动', '我觉得看书能让人安静下来', '我喜欢拍风景照',
      '我偏好小规模的聚会玩桌游', '我觉得创造性的娱乐比消费性的好',
      '我喜欢去独立书店', '我偏好有质感的娱乐体验',
    ],
    phase3: [
      '看了一部超棒的电影激动到睡不着', '打篮球扭了脚好疼', '终于通关了塞尔达好有成就感',
      '去了一场live house超震撼', '追的剧更新了太好看了', '相机镜头摔碎了心疼死',
      '跑完半马超级自豪', '和朋友打桌游笑到肚子疼', '在B站发的视频上热门了',
      '看了场NBA直播太精彩了', '拍了一张超满意的照片', '去展览看到了喜欢的画',
      '打篮球赢了对方队伍很爽', '弹吉他学了一首新歌', '和朋友飞盘打到天黑不想走',
      '看了一部烂片浪费了两小时', '跑步破了个人记录好开心',
      '下雨天窝在家看电影太惬意了', '买的相机配件到了很期待', '周末和朋友一起露营太棒了',
    ],
    phase4: [
      '想和儿子一起玩Switch', '打算参加马拉松比赛', '考虑升级相机设备',
      '想去日本参加音乐节', '打算开一个摄影公众号', '想组织一个桌游小组',
      '考虑买一把好一点的吉他', '想带老婆去看一场live', '打算明年跑一个全马',
      '想去冰岛拍极光', '考虑做一个旅行Vlog', '想把看过的书做个清单',
      '打算带儿子去看NBA现场', '想学一种新的乐器', '考虑报一个摄影课',
      '想和张伟组个乐队', '打算每周多跑一天', '想去参加漫展',
      '考虑入手一个VR设备', '打算开始系统学摄影',
    ],
  },
  {
    name: '学习',
    phase1: [
      '我在学Rust语言', '我每天学习一小时', '我用Obsidian做笔记',
      '我在看操作系统的书', '我读了很多技术博客', '我在学日语N3',
      '我报了个线上课程', '我有个学习计划表', '我用Anki背单词',
      '我在看MIT的公开课', '我学过Python和Java', '我在研究机器学习',
      '我看了CSAPP这本书', '我在学分布式系统', '我有个技术博客',
      '我在准备AWS认证考试', '我订阅了O\'Reilly', '我在学系统设计',
      '我看了很多Rust的视频教程', '我有个Notion知识库', '我每月读两本书',
      '我在学习编译原理', '我参加了Coursera的课程', '我在研究LLM技术',
      '我看了设计模式的书', '我在学Kubernetes的原理', '我每天背50个日语单词',
      '我在学数据库原理', '我看了很多系统架构的案例', '我在准备PMP考试',
    ],
    phase2: [
      '我觉得实践比理论重要', '我偏好看书学习而不是看视频', '我觉得学习要有计划',
      '我喜欢边学边做项目', '我觉得笔记是学习的核心', '我偏好系统性学习',
      '我觉得英语能力对程序员很重要', '我喜欢和人讨论学到的东西',
      '我觉得学习要持之以恒', '我偏好深入一个领域而不是广泛涉猎',
      '我觉得输出是最好的学习方式', '我喜欢写博客总结学到的', '我偏好纸质书',
      '我觉得学习需要反馈', '我喜欢参加技术会议学新东西', '我偏好从官方文档入手',
      '我觉得基础知识最重要', '我喜欢通过问题驱动学习', '我偏好小步快跑的学习节奏',
      '我觉得不要只学热门技术', '我喜欢做读书笔记', '我偏好交互式学习平台',
      '我觉得学习社区很有帮助', '我喜欢用间隔重复法记忆', '我偏好从经典教材入手',
      '我觉得要学会提问', '我喜欢做思维导图', '我偏好主题式学习',
      '我觉得学无止境', '我喜欢分享学习心得',
    ],
    phase3: [
      '终于看懂了Raft协议的论文好开心', '学Rust的所有权让我崩溃了', '日语考试过了超激动',
      '连续学了一个月有点倦怠', '看完DDIA收获太大了', '学机器学习数学太难了',
      '写了第一篇技术博客收到好评', '考试没过好失落', '终于理解了内存管理',
      '学习效率低了好焦虑', '做出了第一个Rust项目很有成就感',
      '看公开课看到一半睡着了', '学新语言的感觉好新鲜', '准备考试压力好大',
      '终于把操作系统的书看完了', '学日语发现需要大量时间',
      '在技术社区回答问题帮到了别人', '觉得自己学得太慢了', '终于搭好了学习环境',
      '和学习伙伴讨论问题很有收获',
    ],
    phase4: [
      '想辞职gap year去学习', '学习投入太多影响了家庭时间', '考虑读一个在职硕士',
      '想把学到的技术应用到副业', '学习让我想换个技术方向', '打算开始写技术专栏',
      '考虑去参加技术大会分享', '学习日语是为了以后去日本工作', '想建一个学习社群',
      '打算用学到的AI知识做个产品', '学习带来的成长让我更自信了',
      '考虑报一个正式的日语学校', '想把知识库整理成一本电子书',
      '打算每天增加到两小时学习时间', '学习计划需要和工作平衡',
      '想找一个学习mentor', '考虑做一个学习App', '打算参加Rust社区的活动',
      '想用学到的知识帮团队提效', '考虑开个技术播客分享学习',
    ],
  },
  {
    name: '居住',
    phase1: [
      '我住在北京朝阳区大望路', '我的房子是90平两居', '我住在18楼', '小区叫望京花园',
      '我的房子是2021年买的', '房子朝南采光好', '小区有健身房', '我住的楼是电梯房',
      '小区旁边有个大超市', '我的邻居大部分是年轻人', '小区绿化不错',
      '离最近的地铁站走路10分钟', '房子有一个阳台', '厨房比较小', '客厅有个投影仪',
      '我用的是米家智能家居', '卫生间做了干湿分离', '书房兼客卧', '阳台种了几盆花',
      '楼下有个便利店', '小区门口有共享单车', '小区有地下停车场',
      '我的房贷是商业贷款', '物业费每月300', '房子装修是简约风',
      '暖气是集中供暖', '夏天开空调冬天有暖气', '小区有门禁和监控',
      '周边有几个不错的餐厅', '小区管理还算规范',
    ],
    phase2: [
      '我喜欢住在城市中心', '我觉得采光比面积重要', '我偏好简约装修风格',
      '我觉得小区安全很重要', '我喜欢高楼层的视野', '我偏好有地铁的位置',
      '我觉得物业管理很重要', '我喜欢智能家居', '我偏好安静的小区',
      '我觉得周边配套比房子本身重要', '我喜欢有阳台种花', '我偏好新房不买二手',
      '我觉得电梯房比楼梯房好', '我喜欢开放式厨房', '我偏好小区有停车位',
      '我觉得通勤时间不超过40分钟', '我喜欢有书房的户型', '我偏好朝南的房子',
      '我觉得邻居素质很重要', '我喜欢小区有绿化', '我偏好成熟社区',
      '我觉得隔音要好', '我喜欢有独立卫生间', '我偏好有储物空间',
      '我觉得厨房要够大', '我喜欢有落地窗', '我偏好南北通透的户型',
      '我觉得小区要有快递柜', '我喜欢智能门锁', '我偏好有暖气的房子',
    ],
    phase3: [
      '新家住进去感觉太好了', '楼上邻居太吵了很烦', '阳台的花开了好治愈',
      '物业不作为投诉了好几次', '装了智能家居生活方便多了', '厨房水管漏了折腾了一天',
      '台风天窗户漏雨好慌', '小区搞了个邻里活动认识了新朋友',
      '房价涨了有点开心', '电梯坏了爬了18楼累死', '周末在家收拾房间很有成就感',
      '养的花被猫咬了好气', '安装了新的投影仪看电影超爽', '空调坏了夏天没法住',
      '收到了物业通知要涨物业费', '阳台晒太阳看书太惬意了', '家里来了蟑螂吓死了',
      '装了隔音窗终于安静了', '邻居送了一盒自制月饼好温暖', '小区门口新开了一家咖啡店',
    ],
    phase4: [
      '考虑换个三居室给儿子独立房间', '想把书房重新装修', '打算在阳台搭个小花园',
      '考虑搬到公司附近缩短通勤', '想换个物业好的小区', '打算装修升级一下智能家居',
      '考虑在杭州买一套小公寓投资', '想把厨房改大一点', '打算换一套南北通透的房子',
      '考虑搬去郊区换个大房子', '想把客厅改造成亲子空间', '打算把阳台封起来做书房',
      '考虑在老家苏州买一套养老房', '想给家里添一些绿植', '打算换一套学区房',
      '考虑租出去一间房补贴房贷', '想把家改造得更适合带娃',
      '打算夏天前把空调换了', '考虑装一个净水器', '想让家更有温度',
    ],
  },
]

// ═══════════════════════════════════════════════════════════════════════════════
// GENERATE MESSAGES
// ═══════════════════════════════════════════════════════════════════════════════

function generateMessages(): { content: string; domain: string; phase: number }[] {
  const messages: { content: string; domain: string; phase: number }[] = []
  for (const domain of DOMAINS) {
    const all = [
      ...domain.phase1.map(c => ({ content: c, domain: domain.name, phase: 1 })),
      ...domain.phase2.map(c => ({ content: c, domain: domain.name, phase: 2 })),
      ...domain.phase3.map(c => ({ content: c, domain: domain.name, phase: 3 })),
      ...domain.phase4.map(c => ({ content: c, domain: domain.name, phase: 4 })),
    ]
    messages.push(...all)
  }
  return messages
}

function toMemory(msg: { content: string; domain: string; phase: number }, idx: number): Memory {
  const scopeMap: Record<number, string> = { 1: 'fact', 2: 'preference', 3: 'event', 4: 'opinion' }
  const emotionMap: Record<number, string> = { 1: 'neutral', 2: 'neutral', 3: 'important', 4: 'neutral' }
  return {
    content: msg.content,
    scope: scopeMap[msg.phase] || 'fact',
    ts: Date.now() - (1200 - idx) * 60000, // spread over ~20 hours
    confidence: msg.phase === 1 ? 0.9 : msg.phase === 2 ? 0.8 : msg.phase === 3 ? 0.85 : 0.75,
    emotion: emotionMap[msg.phase],
    source: 'user_said',
    tier: 'long_term',
    recallCount: 0,
    memoryId: `bench_${idx}`,
  }
}

// ═══════════════════════════════════════════════════════════════════════════════
// 40 FIXED TEST QUERIES
// ═══════════════════════════════════════════════════════════════════════════════

interface TestQuery {
  query: string
  type: 'direct' | 'semantic'
  // At least one keyword that should appear in a relevant result
  expectedKeywords: string[]
}

const TEST_QUERIES: TestQuery[] = [
  // 20 Direct queries
  { query: '我住在哪里', type: 'direct', expectedKeywords: ['住', '朝阳', '北京', '大望路', '浦东'] },
  { query: '我在哪工作', type: 'direct', expectedKeywords: ['字节', '工作', '后端'] },
  { query: '我的血压怎么样', type: 'direct', expectedKeywords: ['血压', '130', '偏高'] },
  { query: '我孩子几岁了', type: 'direct', expectedKeywords: ['儿子', '3岁', '小豆'] },
  { query: '我的房贷多少', type: 'direct', expectedKeywords: ['房贷', '1万2', '贷款'] },
  { query: '我在学什么', type: 'direct', expectedKeywords: ['Rust', '日语', '学习', '学'] },
  { query: '我最好的朋友叫什么', type: 'direct', expectedKeywords: ['张伟', '朋友', '大学'] },
  { query: '我开什么车', type: 'direct', expectedKeywords: ['特斯拉', 'Model 3', '车'] },
  { query: '我最近看什么书', type: 'direct', expectedKeywords: ['三体', '看', 'DDIA', 'CSAPP'] },
  { query: '我在减肥吗', type: 'direct', expectedKeywords: ['减肥', '瘦', '体重', '控制'] },
  { query: '我的工资多少', type: 'direct', expectedKeywords: ['4万', '月薪', '薪'] },
  { query: '我养了什么宠物', type: 'direct', expectedKeywords: ['橘猫', '橘子', '猫'] },
  { query: '我最怕什么', type: 'direct', expectedKeywords: ['怕', '恐惧', '害怕', '焦虑', '黑'] },
  { query: '我下次去哪旅游', type: 'direct', expectedKeywords: ['云南', '日本', '三亚', '旅游', '旅行'] },
  { query: '我戒了什么', type: 'direct', expectedKeywords: ['戒', '咖啡', '奶茶', '酒'] },
  { query: '我老婆是做什么的', type: 'direct', expectedKeywords: ['医生', '老婆', '苏晴', '三甲'] },
  { query: '我用什么电脑', type: 'direct', expectedKeywords: ['MacBook', 'Mac', 'Pro'] },
  { query: '我打什么球', type: 'direct', expectedKeywords: ['篮球', '打球', '球'] },
  { query: '我做过什么手术', type: 'direct', expectedKeywords: ['阑尾炎', '手术', '激光'] },
  { query: '我的血型是什么', type: 'direct', expectedKeywords: ['A型', '血型'] },

  // 20 Semantic queries
  { query: '我的生活状态', type: 'semantic', expectedKeywords: ['生活', '节奏', '作息', '日常'] },
  { query: '我的职业发展', type: 'semantic', expectedKeywords: ['工作', '升职', '职业', '面试', '跳槽'] },
  { query: '我的健康情况', type: 'semantic', expectedKeywords: ['血压', '体检', '健康', '减肥', '胃'] },
  { query: '我的家庭关系', type: 'semantic', expectedKeywords: ['老婆', '儿子', '家人', '父母', '家庭'] },
  { query: '我的经济状况', type: 'semantic', expectedKeywords: ['月薪', '房贷', '存款', '收入', '基金'] },
  { query: '我的饮食习惯', type: 'semantic', expectedKeywords: ['吃', '饮食', '做饭', '外卖', '火锅'] },
  { query: '我最近的心情', type: 'semantic', expectedKeywords: ['心情', '开心', '焦虑', '压力', '烦'] },
  { query: '我的社交圈', type: 'semantic', expectedKeywords: ['朋友', '张伟', '社交', '同事'] },
  { query: '我的出行习惯', type: 'semantic', expectedKeywords: ['地铁', '开车', '特斯拉', '通勤'] },
  { query: '我的娱乐方式', type: 'semantic', expectedKeywords: ['电影', '篮球', '游戏', '音乐', '跑步'] },
  { query: '我在学习什么新东西', type: 'semantic', expectedKeywords: ['Rust', '日语', '学习', '机器学习'] },
  { query: '我的居住环境', type: 'semantic', expectedKeywords: ['朝阳', '小区', '房子', '90平'] },
  { query: '我有什么烦心事', type: 'semantic', expectedKeywords: ['烦', '加班', '压力', '焦虑', '担心'] },
  { query: '我的运动习惯', type: 'semantic', expectedKeywords: ['跑步', '篮球', '运动', '跑了'] },
  { query: '我的投资情况', type: 'semantic', expectedKeywords: ['基金', '股票', '投资', '比特币'] },
  { query: '我和同事关系怎么样', type: 'semantic', expectedKeywords: ['同事', '关系', '团队', '组'] },
  { query: '我的作息规律', type: 'semantic', expectedKeywords: ['睡', '上班', '起床', '失眠', '作息'] },
  { query: '我的消费习惯', type: 'semantic', expectedKeywords: ['花', '消费', '外卖', '支出', '记账'] },
  { query: '我的兴趣爱好', type: 'semantic', expectedKeywords: ['摄影', '音乐', '跑步', '电影', '篮球', '游戏'] },
  { query: '我最近在忙什么', type: 'semantic', expectedKeywords: ['工作', '项目', '学习', '加班'] },
]

// ═══════════════════════════════════════════════════════════════════════════════
// EVALUATION
// ═══════════════════════════════════════════════════════════════════════════════

function evaluateRecall(results: Memory[], query: TestQuery): { hit3: boolean; top1: boolean } {
  const checkHit = (mem: Memory) => {
    const c = mem.content
    return query.expectedKeywords.some(kw => c.includes(kw))
  }
  const top3 = results.slice(0, 3)
  return {
    hit3: top3.some(r => checkHit(r)),
    top1: results.length > 0 && checkHit(results[0]),
  }
}

// ═══════════════════════════════════════════════════════════════════════════════
// MAIN BENCHMARK
// ═══════════════════════════════════════════════════════════════════════════════

const CHECKPOINTS = [50, 100, 200, 300, 400, 500, 600, 800, 1000, 1200]

async function main() {
  console.log('=== AAM Learning Curve Benchmark ===')
  console.log(`Domains: ${DOMAINS.length}, Messages per domain: 100, Total: 1200`)
  console.log(`Test queries: ${TEST_QUERIES.length} (${TEST_QUERIES.filter(q => q.type === 'direct').length} direct + ${TEST_QUERIES.filter(q => q.type === 'semantic').length} semantic)`)
  console.log(`Checkpoints: ${CHECKPOINTS.join(', ')}`)
  console.log()

  const allMessages = generateMessages()

  // Shuffle messages so domains are interleaved (more realistic)
  const shuffled = [...allMessages]
  for (let i = shuffled.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
  }

  console.log(`Generated ${shuffled.length} messages across ${DOMAINS.length} domains`)
  console.log()

  // In-memory store (not written to disk)
  const memoryPool: Memory[] = []

  type Row = {
    messages: number
    hit3: string
    hit3Direct: string
    hit3Semantic: string
    top1: string
    aamVocab: number
    aamDocs: number
    avgLatencyMs: number
  }
  const results: Row[] = []

  let nextCheckpoint = 0

  for (let i = 0; i < shuffled.length; i++) {
    const msg = shuffled[i]
    const mem = toMemory(msg, i)
    memoryPool.push(mem)

    // Feed into AAM's association network
    const emotionIntensity = msg.phase === 3 ? 0.7 : msg.phase === 4 ? 0.5 : 0.2
    learnAssociation(msg.content, emotionIntensity)

    const count = i + 1

    // Check if we hit a checkpoint
    if (nextCheckpoint < CHECKPOINTS.length && count === CHECKPOINTS[nextCheckpoint]) {
      nextCheckpoint++

      // Run all 40 test queries
      let hit3Count = 0, top1Count = 0
      let hit3Direct = 0, hit3Semantic = 0
      let directCount = 0, semanticCount = 0
      let totalLatency = 0

      for (const tq of TEST_QUERIES) {
        const start = performance.now()
        const recalled = activationRecall(memoryPool, tq.query, 3, 0, 0.5)
        const elapsed = performance.now() - start
        totalLatency += elapsed

        const eval_ = evaluateRecall(recalled, tq)
        if (eval_.hit3) hit3Count++
        if (eval_.top1) top1Count++

        if (tq.type === 'direct') {
          directCount++
          if (eval_.hit3) hit3Direct++
        } else {
          semanticCount++
          if (eval_.hit3) hit3Semantic++
        }
      }

      const stats = getAAMStats()
      const row: Row = {
        messages: count,
        hit3: (hit3Count / TEST_QUERIES.length * 100).toFixed(1) + '%',
        hit3Direct: (hit3Direct / directCount * 100).toFixed(1) + '%',
        hit3Semantic: (hit3Semantic / semanticCount * 100).toFixed(1) + '%',
        top1: (top1Count / TEST_QUERIES.length * 100).toFixed(1) + '%',
        aamVocab: stats.vocabularySize,
        aamDocs: stats.totalDocs,
        avgLatencyMs: Math.round(totalLatency / TEST_QUERIES.length * 100) / 100,
      }
      results.push(row)

      console.log(`[Checkpoint ${count}] Hit@3=${row.hit3} (D:${row.hit3Direct} S:${row.hit3Semantic}) Top-1=${row.top1} Vocab=${row.aamVocab} Latency=${row.avgLatencyMs}ms`)
    }
  }

  // ── Final report ──
  console.log()
  console.log('=== RESULTS ===')
  console.log()

  // Table header
  const hdr = '| Messages | Hit@3  | Direct | Semantic | Top-1  | AAM Vocab | AAM Docs | Avg Latency |'
  const sep = '|----------|--------|--------|----------|--------|-----------|----------|-------------|'
  console.log(hdr)
  console.log(sep)
  for (const r of results) {
    console.log(
      `| ${String(r.messages).padStart(8)} | ${r.hit3.padStart(6)} | ${r.hit3Direct.padStart(6)} | ${r.hit3Semantic.padStart(8)} | ${r.top1.padStart(6)} | ${String(r.aamVocab).padStart(9)} | ${String(r.aamDocs).padStart(8)} | ${String(r.avgLatencyMs + 'ms').padStart(11)} |`
    )
  }
  console.log()

  // Summary
  const first = results[0]
  const last = results[results.length - 1]
  console.log(`Hit@3 improvement: ${first.hit3} → ${last.hit3}`)
  console.log(`Top-1 improvement: ${first.top1} → ${last.top1}`)
  console.log(`AAM vocabulary growth: ${first.aamVocab} → ${last.aamVocab}`)
  console.log(`Average latency range: ${results.map(r => r.avgLatencyMs).reduce((a, b) => Math.min(a, b))}ms - ${results.map(r => r.avgLatencyMs).reduce((a, b) => Math.max(a, b))}ms`)
}

main().catch(e => {
  console.error('Benchmark failed:', e)
  process.exit(1)
})
