Skip to content

[codex] Akashic v4:Message WAL、Turn Projection 与普通插件组合 - #536

Draft
kachofugetsu09 wants to merge 7 commits into
mainfrom
codex/add-akashic-v4-design
Draft

[codex] Akashic v4:Message WAL、Turn Projection 与普通插件组合#536
kachofugetsu09 wants to merge 7 commits into
mainfrom
codex/add-akashic-v4-design

Conversation

@kachofugetsu09

@kachofugetsu09 kachofugetsu09 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

结论

这版 v4 把两件事放回同一张设计图里:

  1. 事实层只有 Session + Message:Session 是按 seq 追加的 Message WAL;没有持久 Turn、Run、Attempt 或第二消息载体。
  2. 行为层完整插件化:旧的固定被动回复大链由普通 Turn、passive-conversation、Agent 和 Tool 插件组合承担;Core 只保留持久化、能力边界和外部 effect 的窄底座。

当前实现和历史只用来发现迁移约束,不作为“正确设计”的来源。本 PR 仍是设计提案,不授权实现、schema/data migration、正式 workspace 写入、部署、release 或 merge。

本次关键修正:Turn 是可替换 projection

用户给出的 case 不再被连续时间段或一次执行过程强行切开:

真实 WAL(唯一事实)                 默认 TURN_VIEW(普通插件)

seq 1  Human U1          ───────┐
       interrupt                │  Turn H = {U1, U2, A1}
seq 2  Human U2          ───────┤  (成员可以不连续)
       interrupt                │
seq 3  Agent P           ───────┼─ Turn P = {P}
seq 4  Agent A1          ───────┘
       responds_to(U1,U2)
  • U1、U2 在各自 ingress 时立即 append;interrupt 只取消内存中的 Reaction,不删除、延后或合并 Human Message。
  • A1 显式回答 U1/U2,所以 Turn 插件把 {U1,U2,A1} 投影成一个 Turn。
  • P 虽然插在中间,但与 U1/U2 没有 cause 边,所以独立成 Turn;这里没有 proactive=true、ProactiveTurn 或 Core 特判。
  • 时间线始终按 U1,U2,P,A1 显示;Turn 只是 group 标签,不改写 WAL,也不把 A1 移到 P 前面。
  • 换 Turn 插件只会改变视图和上下文切点,不迁移 Message,也不产生 TurnId/ProjectionId。

最小事实与写入合同

  • Session = session_id + messages ordered by seq
  • Message 只保留稳定 message_idsession_idseqauthorresponds_to[] 和 typed content[]
  • message_id 管身份、幂等和引用;seq 管顺序、缺口和客户端 cursor。两者不是重复字段。
  • 只有一个 canonical message_id;不再增加 client_message_id
  • 初始 v4 每条 Agent Message 最多一个 tool call,因此 call 身份直接复用该 Message 的 message_id;不再增加 ToolCallId、call_ref 或 block-index identity。
  • 模型、网络、token retry 都发生在 Agent 输出 append 前。只有完整 Message durable 后,才算 Human、Agent 或 Tool 真正说过。
  • commit 成功但 ACK 丢失时,以同一 canonical message_id 幂等重试;失败 attempt 不进入 Session。

并发基础只做 CauseOpen CAS;Turn 插件可额外请求封闭的 typed read condition。默认被动回复使用 NoNewHumanInputAfter(source_seq),因此新的 U2 会拒绝只读过 U1 的旧草稿,而中间的 P 不会误伤 A1。HeadEquals 只保留给极少数真的依赖全局 head 的行为。

被动大链没有丢:改为普通插件组合

Session Message WAL + committed feed
                 │
        Turn projection plugin
                 │
      passive-conversation plugin
                 │ selects
         default Agent plugin
                 │
        protected ToolHost ── ordinary Tool plugins
                 │
       Agent/Tool Message append
  • Turn plugin:只 fold Message 因果图并返回 view,不执行模型、Tool、取消或 append。
  • passive-conversation plugin:订阅 committed feed,选择 pending causes,建立一次短命 Reaction;它不是 public MESSAGE_REACTOR 扩展槽。
  • Agent plugin:拥有默认 ReAct、provider retry、Tool Search、空回复与 terminal policy。一条 Reaction 最多追加一条 Agent Message。
  • ToolHost:保护授权、binding、effect start、唯一 result、generation retention 和 crash recovery;普通 Tool plugin 只拥有 schema、领域执行和结果格式。
  • Tool result 是新的 WAL cause,触发下一次 Reaction;不需要跨 Tool 持久 Run。
  • Prompt、command、compaction、memory、citation、meme/media、stream、delivery、cancel 与 cleanup 都在文档中逐项指定 owner;不是只把一小段 passive loop 搬到插件目录。
  • Core 不按 passive、proactive、Wake、Scheduler、command、provider 或具体插件名称分支。

Proactive、Delivery 与删除也遵守同一模型

  • Proactive/Wake/Scheduler/Drift/message_push/subagent 只是 Message 的来源或组合者,不复制执行模型。P 独立成 Turn 是因果结构的结果,不是 proactive 特判。
  • 各 source plugin 仍保留无法由 Session 反推的 schedule、watermark、ACK、cursor、journal 等状态;Phase 0 逐项批准 preserve/replace/retire,不能因删除 proactive 概念而清库。
  • Delivery 是 (message_id, sink_id) 的外部效果 projection;不复制正文、seq 或 digest,也没有随机 DeliveryId/settled
  • eligibility 只由 Message author/content/Hidden 投影:仅用户可见的最终 Agent 内容可发送;Human、Source、Tool result、tool-call 中间消息、no_reply 和 tombstone 不创建 DeliveryEffect。
  • 逻辑删除仍是一条 Human governance Message,因为 Message 是唯一消息载体;它只保存审核过的 seed IDs,隐藏范围由因果闭包动态投影。物理 purge 是后续独立协议。

真实历史只作为 fixture

对 hua-home 的正式 sessions.db 做了只读、脱敏检查,只查询 schema、role、相对 seq 与布尔特征,没有读取或输出正文和 session ID:

  • 发现 2 个 session 中共 6 条 [interrupted] marker;
  • 发现 15 个 proactive row 位于“此前 50 seq 内至少两次 interrupt”的窗口;
  • 一个相对序列窗口呈现 interrupt → 后续 user → interrupt → 后续 user → proactive → 后续普通 assistant

这只证明该交错值得做迁移 fixture,不证明旧 marker、attempt 或 proactive 分支正确。v4 fixture 的断言是:四条完整 Message 依次留在 WAL,Turn groups 为 {U1,U2,A1}{P}

迁移与需要审批的破坏性语义

设计按纵向 Slice A–F 迁移:Message WAL → Turn shadow projection → ToolHost/recovery → 被动大链插件化 → Delivery/source handoff → tombstone projection。每一片都要求旧/新 oracle、crash point 和真实 fixture 对照,不一次替换所有 owner。

Phase 0 明确要求勘误或 supersede projectneed 及决策 0025、0034、0039、0050,并核对 0052 的 compaction/persistence 边界;本 PR 不把设计文字偷渡成已批准合同。

改动范围

  • docs/design/0902-reviewed-v4.md:完整 v4 设计、真实链路证据、owner 表、迁移顺序和 Gate。
  • docs/INDEX.md:新增设计索引入口。
  • 无生产代码、测试、配置、schema、运行数据或部署改动。

验证

  • git diff --check origin/main
  • Markdown fence 成对
  • Clean-head Gate:python docker/debug/gate.py run --base origin/main
    • report:docker/debug/reports/change-gate/20260903-172323-3c745373
    • status:passed
    • head:51f1467456881e7302abf76a931e9dfe698fef6c
    • tree:8b46ae70fce3aab2a5e56dee8934091497942677
    • sourceDigest7a1c712fdd9dc75fdc81e2b696cf85b990fab4c509d446436dc48bb331292bc8
    • planDigest3b2724b0d833f2df049cce3cc78924f8d547c63252a1c014e6284305c64852d9
    • selectedScenarios=[]:docs-only structural Gate,不替代后续实现、迁移、crash 与真实 provider fixture。
  • 独立 Concept Gate 对 exact head 51f14674 只读复核:PASS,无 must-fix 或 advisory。
  • GitHub change-impact-gate:通过。
  • GitHub check-and-test:失败于 Python collection;pytest -W error 将 Starlette 导入 anyio.abc.BlockingPortal 时的第三方 DeprecationWarning 升为错误,影响 test_dashboard_api.pytest_plugin_hot_reload.pytest_web_chat_channel.py。共收集 981 tests,测试体与 Web regressions 尚未运行。本 PR 只有 Markdown,不在这里越界修改依赖。

审阅时请重点决定

  • 是否批准 Session + Message 是唯一对话事实,失败 attempt 不入库。
  • 是否批准 Turn 是普通插件拥有的可替换 projection,并接受非连续 {U1,U2,A1} 与独立 {P}
  • 是否批准 CauseOpen 是基础并发合同,额外隔离只用封闭 typed condition。
  • 是否批准 call 身份复用 Agent message_id,不再引入额外 call/message 身份。
  • 是否批准完整被动链的 owner 拆分、protected ToolHost 和 multi-sink Delivery projection。
  • 各 source plugin state 的 preserve/replace/retire 选择。

精确版本与恢复点

  • base:47896b4200731183a54081e2eca77602a0881a0a
  • head:51f1467456881e7302abf76a931e9dfe698fef6c
  • branch:codex/add-akashic-v4-design
  • 本地恢复 ref:refs/backup/pre-tempp-review-v4-20260903acf866b33054ff4f233c50eb918d9ad5a1c11991
  • 回滚方式:关闭 Draft PR 或普通 revert;未修改正式 workspace 与 hua-home。

@kachofugetsu09 kachofugetsu09 changed the title [codex] 添加 Akashic v4 设计提案 [codex] 提出 Session 单一消息真源的 Akashic v4 设计 Sep 3, 2026
@kachofugetsu09

Copy link
Copy Markdown
Owner Author

CI 说明:change-impact-gate 已通过;check-and-test 在测试收集阶段失败,因为 FastAPI/Starlette 导入已弃用的 anyio.abc.BlockingPortal,而 CI 使用 -W error。同一错误同时出现在本 PR 的前一 head 39f98176 和当前 head bbea1aeb;本分支相对 main 只改 docs/INDEX.mddocs/design/0902-reviewed-v4.md。这是依赖/CI 漂移,不由本文档触发;为保持 Draft PR 单一审阅范围,本 PR 不夹带依赖修复。失败 job:https://github.com/kachofugetsu09/akashic-agent/actions/runs/33721759992/job/100542174909

@kachofugetsu09 kachofugetsu09 changed the title [codex] 提出 Session 单一消息真源的 Akashic v4 设计 [codex] 将 Akashic v4 收敛为 Session Message WAL Sep 3, 2026
@kachofugetsu09 kachofugetsu09 changed the title [codex] 将 Akashic v4 收敛为 Session Message WAL [codex] Akashic v4:Message WAL 与普通插件组合 Sep 3, 2026
@kachofugetsu09 kachofugetsu09 changed the title [codex] Akashic v4:Message WAL 与普通插件组合 [codex] Akashic v4:Message WAL、Turn Projection 与普通插件组合 Sep 3, 2026
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