feat: Callback 送回抽象(issue #53) #57
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/53-callback-return-abstraction"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #53
这个 PR 做了什么
实现 issue #53「Callback 送回抽象:存储 + 到期扫描 + 无门控送回集成」。这是深挖任务委托(issue #52 PRD)"任务完成后无门控送回"投递语义的地基——本片只建通用管线本身,不接任何真实生产者(issue #54/#55/#56 均在此片之后,测试直接写入记录来验证行为)。
新增 Callback 存储切片(
callback.py)CallbackRecord:id/chat_id/content/trigger_source(当前只有"task_completion"一个取值,字段本身对未来扩展开放,如register_callback的"user_reminder")/created_at/fire_at(可空——本次唯一生产者语义上是"立即到期")is_due:到期判定纯函数(fire_at为空或已到期即算到期),零依赖真实时钟/调度器render_callback_directive:送回时追加的合成 system 指令——措辞刻意保持生产者中立,不假设任何具体生产者的产出形态CallbackStoragePort:per-chat_id 支持多条待定记录,不是单槽位设计(同pending_intent.py的 per-scope 多记录先例)sent_log.py/storage.py:内存版(SentLog)+ Postgres/SQLite 持久化版(PersistentStorage)双实现RuntimeLoop.run_callback()(runtime_loop.py)run()抽出_full_frozen_snapshot()私有方法(画像 + 三因子召回 + 关系网 + 距上次交互 + 未决意图 + 输入状态六段全量拼装),run_callback()复用同一套——区别于run_light()/_run_event_driven_turn()的裁剪版(issue #53 AC 明确要求"而不是走 run_light/事件驱动的裁剪版组装")_run_directive_turn()共用尾段(assemble + 追加合成指令 + 工具循环 + flush),run_callback()与既有_run_event_driven_turn()共用,避免重复实现run_light()既有边界);不写 familiarity/距上次交互重置(没有真实消息可归因)sender_ids取对方裸 user_id(同 Drive Tick 先例);群聊没有单一可归因用户(CallbackRecord不携带触发者 user_id),保持空__init__.py调度驱动_callback_scanAPScheduler 定时任务(arise_callback_scan_interval_seconds,默认 30s),扫描全体待定记录,到期即经_deliver_callback无门控直接送回_pending_flushes追踪(同 Drive Tick 先例),正被前台占用的 chat 顺延到下一次扫描——记录不删除,天然重试_evaluate_unified_gate,不消耗两级门控的沉默预算(issue #53 AC)delete_callback,不会被下一次扫描重复送回测试
新增 4 个测试文件:纯函数(
is_due/render_callback_directive)、存储契约(内存版 + 持久化版共用,含 per-chat 多条不互相覆盖)、RuntimeLoop.run_callback()的完整快照区分度断言(私聊/群聊)、_callback_scan端到端场景(零 LLM 调用/送达/不重发/忙时 defer/门控绕过 + 沉默预算不被触碰)。全部 841 个测试通过,
ruff check/ruff format干净。Code review
跑过
/code-review(Standards + Spec 两轴并行子智能体):render_callback_directive措辞越界(把 issue #56 专属的"不要写成分析报告"钉死进了本应生产者中立的通用模块)——已修复,泛化为"不要机械照搬原文"run_callback与既有_run_event_driven_turn尾段重复——已抽出_run_directive_turn共用