Skip to content

feat: 项目记忆分图与逐图故障隔离,整合显式部署策略 - #770

Merged
kachofugetsu09 merged 9 commits into
mainfrom
feature/wide-scope-projects
Sep 26, 2026
Merged

kachofugetsu09 merged 9 commits into
mainfrom
feature/wide-scope-projects

Conversation

@kachofugetsu09

@kachofugetsu09 kachofugetsu09 commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

问题与结果

  • 解决的问题:Akashic 没有 Project 概念;Akasha 从所有可学习 Session 学进同一张图,用户无法让某个项目“共享全局记忆 / 独立记忆 / 不学习”。
  • 用户可见结果:Web 侧栏新增“项目”分组和新建项目弹窗(名称 + 记忆选项);项目内新建的会话归属该项目,按所选策略学习和召回。
  • 本 PR 不处理:策略变更后的重建协议;“独立图同时读全局”等读写集合分离的组合;Project working root / coding context([Project] 为通用 Akashic 增加项目 Session 与 coding context #369 草案其余部分);Mobile 原生端展示。

Change intent

  • change_type:feature
  • semantic_delta:compatible(无 scope 的旧 Session 字节不变,缺失策略即 global,与现状一致)
  • capability_owner:mixed(Core:Session scope 与维度注册;plugin:projects、akasha、conversation、akashic_clients;frontend)
  • consumer_scope:Web chat、conversation 来源、Akasha
  • runtime_patch:none
  • runtime_patch_reason:不适用
  • authoritative_state_owner:sessions.attributes.scope 归 Core(SESSION_ADMISSION);项目记录归 projects;记忆策略与独立图归 Akasha
  • client_only_alternative:不可行。项目归属与记忆路由必须是持久事实,前端分组无法决定 Akasha 写入哪张图
  • concept_gate:required
  • concept_gate_reason:新增 Core 公共扩展点(维度 owner 注册)并改变 Akasha 的存储布局
  • 关联不变量:SES-005、SES-010(新增)、MEM-009、MEM-013(新增)、CTRL-003
  • protected_state:sessions.db/sessions.attributes、sessions.db/owner_records、memory/akasha.db、memory/akasha-graphs/
  • 允许的副作用:新 Session 写入 scope;新建项目与策略记录;按需创建独立图目录
  • 禁止的副作用:改写已有 Session 属性或消息;迁移或改写 memory/akasha.db;删除项目或图文件

改动范围

  • 主要文件:
    • Core:session/log.py(SessionAttributes.scope)、agent/plugin_composition/messages.py(register_dimension、首次接纳校验)、agent/plugin_composition/message_view.py
    • 插件:plugins/projects/(新增)、plugins/conversation/plugin.py、plugins/akashic_clients/web_chat.py、plugins/akasha/scopes.py(新增)以及 Akasha 的 plugin/runtime/consumer/rebuild/recall/tools
    • 前端:frontend/chat/src 的侧栏、项目导航、新建弹窗、controller
    • 文档:决策 0073、projectneed SES-010/MEM-013、INDEX、持久化状态地图、测试基线
  • 配置或迁移影响:无迁移,无 yoyo 变更。scope 为空时不写键
  • 已知 schema lineage 与最终 schema identity:sessions 表结构不变,只有 attributes JSON 可选增加 scope 键
  • 协议 source、runtime、provider 与 scenario 的不可变 revision:不适用
  • 回滚方式:回退本 PR。已写入 scope 的 Session 在旧代码下解码失败(decode_attributes 拒绝未知键),所以已经用过项目功能的 workspace 需要先恢复 sessions.db 备份再回滚;独立图目录可以原样保留

验证

  • 概念基线 pytest 已通过:pytest -q tests 44 passed(当前 2d3b89c7)。Session scope 回归节点 test_message_log.py::test_session_scope_is_fixed_at_admission_and_absent_for_old_sessions,守护基线 §1 的 C4(Session 固定事实不可改写)和 O(新增维度不改旧行),已登记为基线第 42 条。它在 main 上会失败,因为 main 没有 SessionAttributes.scoped
  • 静态检查:pyright 主工程 0 errors、tests 0 errors;plugin_boundary.py check R1–R3 均为 0;check_yoyo_migrations.py、generate_control_schema.py --check 与 generate_host_bridge_protocol.py --check 通过;npm run typecheck 通过
  • 真实设备证据:不适用(没有改 Mobile 原生端)
  • 未运行项与原因:
    • 没有用真实 embedding 模型验证独立图的实际学习和召回
    • 前端没有做浏览器视觉检查,只通过了 typecheck、eslint 和 bundle 构建
  • 临时 workspace 手工端到端(不接触正式 workspace):插件加载,创建项目,设为 isolated;带 session_dimensions 的消息接纳后 scope 为 (("project", pid),);未知项目被 MessageConflict 拒绝;改变 scope 被拒绝;同一取值的策略第二次写入被拒绝

逐图故障隔离修复(2026-09-26)

  • 提交:0c8e88a7f994250805fabbea20ea92f79453fb2c、2d3b89c7b6aeffb5a1dcc8a108183021b1713072。维护者确认故障图明确不可用,其他图继续学习与召回。
  • 根因:后台学习在首个不可用图处 break;公共 health 又允许健康图清除其他图错误。现在分别记录公共 embedding 故障与逐图故障;已知图故障继续下一张图,错误包含图身份;未预期异常继续传播。
  • 显式 recall_memory 与 remember_memory/forget_memory 共用路由 guard,拒绝已记录故障的图并报告身份与原因;不改变已有查询回执恢复语义。
  • 不自动重建故障图,不回退到全局图,不改变持久化 schema。只显式重建或该图成功加载后清除该图错误。
  • 新增基线第 43 条,守护 O 故障局部化与 MEM-013 独立消费进度。既有生命周期测试不覆盖同一 Akasha 插件内的多张图。真实安装 Akasha 与 MessageLog,确定性 provider 仅替代外部 embedding 边界;default/isolated 故障各一组,验证健康图消费、实际召回、故障提示持续可见、故障图文件字节不变,以及真实工具 binding 下两种反馈均明确拒绝故障图。
  • 红绿证据:旧实现 3754afec 上健康图等不到学习而超时;工具入口补丁前反馈错误不带图身份,新增断言两组失败。最终专门回归 2 passed,完整基线 44 passed(9.92s)。
  • 验证:主工程/tests/Akasha pyright 均 0 errors;plugin_boundary R1–R3 均 0;yoyo、两项协议生成检查、前端 typecheck 全通过。2d3b89c7 补丁后重跑完整 pytest、tests/Akasha pyright 与 plugin_boundary;其余检查输入未变,沿用 0c8e88a7 的通过结果。Host Bridge 生成器用 uv run --no-project --with grpcio-tools==1.78.0 隔离运行。
  • 本修复恢复点:父提交 3754afec;可 revert 本修复,无持久数据迁移。修改前源码归档:/tmp/pr770-before-graph-health-3754afec-20260926.tar。

正交性与概念完整性

  • 是否属于架构性 PR 或大改动:yes
  • 独立 reviewer / model / reasoning:独立只读 reviewer concept_review / gpt-5.6-terra / xhigh
  • 审查 head:2d3b89c7b6aeffb5a1dcc8a108183021b1713072;累计基线 c4bc49343a9e90a66a57fb1aab877eea07723b6a
  • 新增概念及其唯一 owner:
    • Session scope:Core,接纳时固定
    • 维度 owner:每个维度一个插件,project 归 projects
    • 记忆策略与图:Akasha
  • 无关设计轴的变化传播:RecallTool 和 FeedbackTool 从持有单个路径改为按 Session 取图,以适配多图
  • 最短正常/失败/热更新链路:Web session_dimensions → web_chat metadata → conversation accept → SESSION_ADMISSION.ensure → 维度 owner check → MessageLog.ensure_session。失败时在写入 Input 前抛错。维度注册走 ctx.effect,插件卸载时随之清理
  • legacy/source-specific 残留扫描:Core 里没有 project 字面量;前端宿主按插件 ID(projects、akasha)组合查询,决策 0073 记录了以后改用 project.settings 槽位
  • must-fix 及处置证据:已清零。评审发现显式 recall/feedback 绕过逐图故障状态;2d3b89c7 在共享路由加入 guard,并扩展真实工具 binding 回归,补丁前失败、补丁后通过。
  • 最终结论:概念 Gate 通过;逐图诊断状态属于 Akasha apply 生命周期,无新持久事实;公共 embedding 与逐图故障互不覆盖;自动/显式入口采用一致故障语义;未知异常传播,显式重建恢复。评审只读,没有自行运行测试,行为验证见上节。
  • 非阻塞观察:Akasha dashboard 仍只展示 default 图,项目图可见性属于后续产品工作。

工作手册

  • 已核对 projectneed.md、相关决策和 NOW.md
  • 长期语义变化:维护者在会话中要求实现本设计;新增 SES-010、MEM-013 和决策 0073,请在评审中确认
  • 跨仓库或客户端改动:不适用(只改仓库内 Web 前端)
  • NOW.md:没有对应事项,不适用

关联:#369、#370(Project Session / Project Akasha 草案,本 PR 只提升项目归属和记忆图两部分);#630

整合线上部署策略(2026-09-26)

  • 维护者明确授权:整合线上 feature/deploy-operator-policy@a700146e 与本 PR,复核后合入 main,再更新 hua-home。
  • 当前整合 head:8190b8170bb4e462eb3ae6e788c9145efcb57290。代码自动合并;重复决策号拆为 scope 0073、部署策略 0074,入站链接同步。
  • 保留线上已采用的 operator 显式 plan / backup / migrations 合同与非 root 发布清单权限修复。省略 plan 只换 Core/Bridge,未列插件保持原 ref;新插件走正式安装入口。
  • 当前整合验证:44 passed(12.11s);主工程/tests pyright、plugin_boundary、yoyo、Control/Host Bridge 生成物、前端 typecheck 全通过。
  • 独立概念 Gate:concept_review / gpt-5.6-terra / xhigh 对 8190b8170bb4e462eb3ae6e788c9145efcb57290 审查通过,无 must-fix。确认显式 targets、migration 审批、停止期 backup、Root CAS、resume 与 projects 正式安装链;未运行测试。此前 2d3b89c7 结论保留为 scope/图故障修复的相邻证据。
  • 远端 CI:8190b817 的 check-and-test 与 plugin-boundary 均 success。
  • 已合入 main:c0324b7aa7a815968773dbcaf03e37f82424a760,其 tree 与已验证的 8190b817 一致。
  • hua-home 已部署该 exact main SHA,image sha256:70c874db0183b8ebc9baaf62859d57d0e454da27042ef4f5ba1745514236540a。active receipt:deploy-4838d5e0a7dcf34251b27140.json,status/phase 为 active,doctor healthy。
  • 按维护者最新指令取消全状态备份,以无 --backup 安装完成;回执 backupDir=null、migration_ids=[]。首次备份在任何插件更新前中断,未发布 manifest,保留现场但不作为完整恢复点。
  • 部署清单只更新 akasha@release、akashic_clients@release、conversation@release;随后经正式 plugin-install 安装 projects,update_id pr770-projects-c0324b7a-20260926 再次查询为 selected/active。
  • 最终 Root:8c41b32edbe38bbcbc08a1c4178330232d1089868c7c6d5189f6cff396798465,64 selected / 64 active,source_failures 为空。逐项比较部署前 selection:只有三个计划目标改变,新增 projects,其余 60 项 ref 保持不变。
  • 正式环境核验:主机 health-check 通过、无 failed units;Core/Workloads/RSSHub/Browserless/real-browser/Redis healthy、restart=0、OOM=false;Core 到四项外围 TCP 连通;OpenCLI daemon/extension/connectivity 正常;Core 启动日志 error/critical=0;sessions.db quick_check=ok。
  • Web/Mobile 核验:LAN Dashboard/Chat HTTP 200;真实 project.list 查询成功;已服务的 Chat JS 包含共享全局/独立/不学习三种选项;公网 WSS 收到真实 server.challenge。当前工具没有可用浏览器,未完成页面渲染/视觉核验,也未在正式环境创建测试项目或注入损坏图。逐图故障行为由上述本地真实插件回归覆盖。

- Session 新增接纳时固定的 scope 宽键,缺失维度即 default,旧行不迁移
- SESSION_ADMISSION 支持维度 owner 注册,首次接纳时校验取值
- 新增 projects 插件拥有 project 维度,项目只改名或归档
- Akasha 声明 embedding 记忆槽位,按 global/isolated/off 策略路由到默认图或独立图
- Web 侧栏新增项目分组与新建项目弹窗,可选择记忆策略
- 决策 0073,新增 SES-010、MEM-013
…xes-20260925

# Conflicts:
#	plugins/akasha/plugin.py
#	plugins/conversation/plugin.py
@kachofugetsu09 kachofugetsu09 changed the title feat: Session scope 宽键、projects 插件与 Akasha 按范围分图 feat: 项目记忆分图与逐图故障隔离,整合显式部署策略 Sep 26, 2026
@kachofugetsu09
kachofugetsu09 marked this pull request as ready for review September 26, 2026 04:05
@kachofugetsu09
kachofugetsu09 merged commit c0324b7 into main Sep 26, 2026
2 checks passed
@kachofugetsu09
kachofugetsu09 deleted the feature/wide-scope-projects branch September 26, 2026 04:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant