OpenProgram允许本地界面与Telegram、Discord等渠道共用一个agent和一份记忆。这一页依次记录当前方法、参考框架、采用与拒绝的设计,以及实现进度。
运行时权限只有owner和paired。未配对不是第三个权限档位:消息不会进入agent。身份只使用渠道平台提供的稳定ID,正文不参与身份判断。
从Telegram/Discord的平台元数据取发言人ID和显示名。正文不参与身份判断。
稳定ID查询allowlist。未配对消息在此停止;批准只能来自本地CLI或回环Web请求。
speaker_*、实例owner principal和authority_tier作为独立字段持久化并传播。
_gated_execute按固定tier→capability表检查;缺少或未知档位直接拒绝,规则和bypass不能跳过。
owner可完整管理记忆;paired只能回复并追加。已配对内容可信;未配对群聊来源保持pending,owner显式提升后才进入Topic提炼。
memory_update的修改由工作区强制限制为新建或字节追加;只有显式持久化的owner轮次可以改写或删除已有内容。仍延期的是越权请求hold队列和按请求方档位过滤读取结果。
以下结论核对自refs-a/与refs-b/的本地源码快照:Codex f344a80a、OpenCode 0bff28de、OpenClaw c71c29ec、Hermes Agent 3bd844ed、pi-mono 936aff00、WeClaw 10711d0c。外部文档调研还覆盖Claude Code、MCP规范、LangGraph、OpenAI Agents SDK、AutoGen与Letta;本节只把可由本地代码复核的权限和记忆机制列为实现证据。
refs-b/openclaw/src/pairing/pairing-store.ts配对码固定8位,排除0O1I,有效期1小时,每个channel account最多3个待处理请求。docs/channels/pairing.md明确未知DM不会被处理;DM admission、command owner与group authorization是不同状态。
refs-a/codex/codex-rs/memories/README.md记忆提取按rollout领取有界任务,任务带租约和失败退避;全局整合只允许一个writer修改共享工作区,并记录成功或失败。它以thread级水位管理进度,不解决同一SessionDAG内的分支来源。
refs-b/hermes-agent/agent/memory_manager.pysync_all在完成一轮后调用全部provider,MemoryProvider.on_session_switch提供会话切换通知。记忆写入本身没有持久化的待处理游标,provider是否处理切换取决于各实现。
refs-a/opencode与refs-b/{pi-mono,weclaw}这三个快照没有与本页等价的长期记忆写入链。pi-mono的SessionDAG使用追加式label/leaf记录;OpenCode保存线性消息并以revert管理尾部;WeClaw只保留下游session标识或有限进程内历史。
| 判定 | 来源 | OpenProgram正式方案 |
|---|---|---|
| 采用 | OpenClaw pairing;Codex有界任务和单writer;Hermes统一provider入口 | 稳定ID admission、owner/paired固定权限表、统一writer入口、持久化状态与有界backfill。 |
| 修改后采用 | OpenClaw session-backfill与memory status | backfill只选择未被Topic引用的trusted Source;status只做本地只读统计,不主动加载模型或修复工作区。 |
| 拒绝 | Codex独立任务数据库;Hermes每轮同步;OpenClaw允许外部archive进入backfill预览 | 复用节点marker、Source引用、workspace revision和文件锁;达到阈值或闲置时才调用模型;外部archive不进入可信提炼。 |
入口采用稳定ID配对;运行时只保留owner和paired;工具执行只查询固定常量表;未配对群聊来源以pending归档但不主动提炼。详细定案见authority-handoff.md。
请求只带owner/paired枚举;陌生账号收到8位配对码,批准只走本地owner通道(终端/本机Web),渠道消息无权触发;不写迁移代码,上线后所有非owner账号首次发言统一走配对;可变昵称不参与身份匹配;显示名过消毒;拒绝返回结构化原因码。
trust_state记为pending,检索时分得清是谁说的,也不会被自动召回带进上下文。openprogram memory backfill处理未被Topic引用的trusted Source并排除pending;失败批次不安装,重复执行跳过已引用来源。writer状态通过工具、CLI和Web返回最近成功、最近失败分类、retryable判定与待处理数。memory.backend=none在创建工作区前拒绝全部CLI memory动词和/api/memory/*路由。
已配对成员的越权请求(如"帮我重启服务")进入队列,由owner做一次性批准;记忆读取按请求方档位过滤,写入侧归因元数据已经实现。
memory.writer.model允许实时覆盖;未知异常默认不可重试。真实工作区的23个旧v1 source文件经精确兼容读取后,154个frame全部通过解析;一次真实writer验收把2条待处理消息提交为3个Topic文件和5个block,重复扫描处理0个会话且revision不变。backfill、writer状态、CLI/Web禁用边界、paired命名和组合测试已经实现;真实工作区的152条历史未引用Source尚未执行backfill。写入失败原因码是一个封闭枚举,受限writer阶段看不到Source归档。