Feed 是一个 Akashic Plugin API v3 插件。它用现有的三个正交能力组合出完整 Feed 链路:
Core Timer ──触发──> Feed source ──submit──> Content inbox
│ │
└──精确 revision ACK <───┘
用户 Turn ──调用──> Feed MCP ──只做──> 订阅管理 / 缓存查询
MCP_SERVERS:只注册用户主动调用的feed_manage、feed_query。MCP lifespan 不启动后台轮询,也没有主动内容专用工具。TIMERS:正式稳定 Root 拥有唯一轮询 Timer。每次只注册一个 one-shot deadline;完成 settlement、拉取、提交和 deadline 持久化后再注册下一次。content.source.v1:以feed-subscriptions身份提交完整 Feed item,并接收 Content 的 delivery settlement。ACK 精确绑定event_id + content_hash;旧 revision 的 ACK 不会误确认新内容。
Feed 的 SQLite 是 provider 事实 owner:订阅、完整 item、当前 poll state、ACK
和每个已导出 revision 的冻结 payload 都留在 feed_mcp.sqlite3。Content 是待处理
与投递状态 owner。纯诊断日志固定为 5 MiB、最多 3 个备份;空轮询只更新当前
deadline,不提交 Content,也不制造持久内容历史。
候选版本允许自己的 MCP managed-process 完成 readiness/handshake,但
candidate_read_only_tools = [],且 recording backend 不接触 Feed 数据。候选 Root
不会收到 runtime.started,因此不会注册 Timer、访问外部 Feed 或写正式数据库。
feed-mcp
├─ akashic.plugin.toml
├─ plugin.py # 组合 MCP、Timer、Content source
├─ content_source.py # Feed source 私有生命周期
├─ feed_runtime/backend.py # MCP 与 source 共享的唯一 Feed domain 实现
├─ skills/
└─ mcp/
├─ run_mcp.py
└─ src/mcp_bridge.py # 薄 MCP adapter
正式数据由 Core 分配到 plugin-data/feed-<marketplace>/。从 v2 迁移仍使用
scripts/migrate_v2_data.py;它保留源数据并产生可核对的 migration receipt。
旧 proactive island 正式切换使用
scripts/retire_legacy_feed_backlog.py。默认 --plan 只读输出 Core inventory 与
Feed 当前完整 backlog 的 count/digest;显式 --apply 必须回传这些 exact 值,并在
Core H2 handoff 前把整批 pre-cutover provider revision 原子标记为
cutover_superseded。该路径不向 Content 提交旧条目,重复执行只接受同一 batch receipt。
CI 固定 Core 065dfb7fb37534c57ed500b1ed9b5deb7090cdb0,运行单元测试、真实
Manager + stdio MCP + Content + Timer fixture、pyright、compileall 和
git diff --check。Manager fixture 还证明:候选零 Timer/零正式写,发布时旧
Timer 已取消后新稳定 Root 才接班。