feat(session): 落成事件出口,五个接缝全部有调用点
Event 从零字段变成 kind + run_id + model_binding + step,新增 EventKind(只有一种取值, 但第一天就带 kind,逼每个出口分发)。事件在「一步走完」原子落地之后发,只有这次进程里 真的执行过的步才发;投递失败接住、计数进 RunResult、继续跑,CancelledError 原样穿过。 契约套件那两条 xfail 关掉:一条要断言的是库发了几次、接缝自己看不到;另一条的前提是错的 ——审计纪律由意图日志承担不由事件流承担,改成在 unit 层验日志里原文与改写后的文本各有 位置。_project_observation 那段说「将来靠事件流送出去」的注释一并改对。 283 passed / 15 skipped / 2 xfailed,剩下两条 xfail 是原子写与前缀持久性,没有机器兜底。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
from collections.abc import Mapping
|
||||
from dataclasses import dataclass
|
||||
from enum import StrEnum
|
||||
from typing import Protocol, runtime_checkable
|
||||
|
||||
from polyloop.types import (
|
||||
@@ -30,6 +31,7 @@ from polyloop.types import (
|
||||
RunFinished,
|
||||
RunStarted,
|
||||
StepCompleted,
|
||||
StepRecord,
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -119,14 +121,43 @@ class RunLog:
|
||||
finished: RunFinished | None = None
|
||||
|
||||
|
||||
class EventKind(StrEnum):
|
||||
"""事件的种类。
|
||||
|
||||
**只有一种取值,但 `Event` 从第一天起就带 `kind`。** 加一个取值在类型上是兼容变更,可是
|
||||
对一个「假定每条事件都是步事件」写出来的出口来说,新取值会被静默地当成步事件读。带上
|
||||
`kind` 逼每个出口从第一天起就分发,新取值那天它至少是显式地没被处理。
|
||||
|
||||
加取值要走 `CLAUDE.md` §2 那道人类门,和改停止原因的取值同一档。
|
||||
"""
|
||||
|
||||
#: 一步走完,而且是**在这次进程里真的走完的**。从日志里读回来直接跳过的步不发这条。
|
||||
STEP_FINISHED = "step_finished"
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True, kw_only=True)
|
||||
class Event:
|
||||
"""从事件出口发出去的一条事件。
|
||||
|
||||
**字段还没定。** 事件集与具名回调清单要独立成一份 design doc;在那之前这个类型只有名字,
|
||||
`EventSink.emit` 的签名不会因为它定下来而改变。
|
||||
事件集定在 `research-wiki/design/0013-event-set-and-callbacks.md`。**它带的每一条事实在
|
||||
存储里都另有一份**——这条不变量是「投递失败不打断循环」那条契约成立的前提,不然一个连不上
|
||||
的后端会让一次运行的部分事实静默消失,而运行本身照常返回成功。
|
||||
|
||||
**没有 `schema_version`。** 事件不是持久化结构(`CLAUDE.md` §1.4 管的是会被下游存进数据库
|
||||
或实验数据集的那些);下游把它存下来时,存的是它自己那张表的 schema。真正需要版本的那部分
|
||||
是步记录,它带着自己的 `schema_version` 一起进来。
|
||||
"""
|
||||
|
||||
kind: EventKind
|
||||
#: 一个出口可以被并发的多次运行共用,没有这个标识那些事件在出口那边混成一串。
|
||||
run_id: str
|
||||
#: 项目自己那套标识,原样来自请求上的同名字段。**它不能从运行标识倒推**——一次业务会话
|
||||
#: 可能包含多次运行,两者不是一回事。
|
||||
model_binding: Mapping[str, str]
|
||||
#: 整条步记录,不是挑几个字段拼的摘要。摘要是一次投影,而投影会漂移:步记录加一个字段,
|
||||
#: 事件里自动就有,两边不可能对不上。
|
||||
step: StepRecord
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 五个接缝
|
||||
@@ -257,6 +288,7 @@ __all__ = [
|
||||
"Decision",
|
||||
"DecisionParser",
|
||||
"Event",
|
||||
"EventKind",
|
||||
"EventSink",
|
||||
"FinalAnswer",
|
||||
"InvalidDecision",
|
||||
|
||||
Reference in New Issue
Block a user