复盘模块、复盘 Agent 与数据展示架构接口设计
本设计包含三个协作部分:
复盘业务模块 :负责复盘范围校验、事实统计、证据构建、报告生命周期、历史查询、周期配置、Agent 任务调度、结果校验和展示模型。
复盘 Agent Adapter :只根据已经计算好的事实和证据生成复盘文字,不拥有业务状态和写权限。
前端复盘展示模块 :只消费 ReviewReportView 并提交用户操作,不重新计算统计数据。
母 AI 编排模块是交互入口之一,但不是复盘模块的数据聚合器、Repository、定时器或报告状态机。
母 AI / API / 周期调度器 / GoalCompleted 事件
→ ReviewUseCase
→ ReviewFactReader 获取 FactSnapshot
→ FactCalculator 计算事实和证据
→ ReviewRepository 保存事实版本
→ ReviewNarrativeGenerator 调用复盘 Agent
→ NarrativeValidator 校验 Agent 草稿
→ ReviewRepository 保存 ready / partial 报告
→ ReviewReportViewBuilder
→ 前端交互与展示模块
核心约束:
复盘模块拥有 ReviewReport、复盘事实、生成任务、周期配置和展示 DTO。
复盘模块不直接读取其他领域 Repository,只通过 ReviewFactReader 获取按用途裁剪的 FactSnapshot。
完成率、次数、耗时和原因分布由复盘模块内的确定性代码计算,LLM 只组织文字。
复盘 Agent 不读取数据库、不计算事实、不保存报告、不修改事项、不触发重排。
母 AI 只识别意图、确定或追问复盘范围,并通过 Capability Gateway 调用 ReviewUseCase。
周期调度器只触发 ReviewUseCase;提醒模块只消费 ReviewReady 事件。
前端只渲染展示模型,不重新计算统计数据。
0. 复盘模块硬边界
0.1 边界以内
以下职责和数据必须位于 timeflow.review:
ReviewUseCase:目标复盘、周期复盘、查询、重试和周期配置的业务入口。
FactCalculator、EvidenceBuilder:确定性统计和证据目录。
ReviewReport 状态机及 facts_revision/revision 并发规则。
ReviewGenerationJob、PeriodicReviewConfig。
NarrativeValidator、ReviewReportViewBuilder。
ReviewFactReader、ReviewNarrativeGenerator、ReviewRepository、ReviewOutbox 等 Port 定义。
复盘模块拥有的数据:
ReviewReport
GoalReviewFacts
PeriodicReviewFacts
EvidenceCatalog
ReviewNarrative
ReviewGenerationJob
PeriodicReviewConfig
0.2 边界以外
外部能力
权威模块
与复盘模块的协作方式
用户意图、多轮追问
母 AI / Orchestrator
调用 ReviewUseCase,不读写报告
当前用户与会话
Identity
提供可信 AuthenticatedUser
日程、待办
Scheduling
通过事实查询适配器只读提供
Goal、GoalTask
Goal
通过事实查询适配器只读提供
ExecutionFeedback
Feedback
通过事实查询适配器只读提供
重排操作事实
Replanning / Audit
通过事实查询适配器只读提供
AI 文字生成
Review Agent Adapter
实现 ReviewNarrativeGenerator
物理数据库
Persistence Adapter
实现 ReviewRepository
周期触发
Scheduler
调用 ReviewUseCase.generatePeriodicReview
系统通知
Reminder
消费 ReviewReady 事件
图表和页面
Frontend
只消费 ReviewReportView
0.3 允许穿越边界的契约
允许进入复盘模块:
Command:GenerateGoalReviewCommand、GeneratePeriodicReviewCommand、RetryReviewNarrativeCommand、UpdatePeriodicReviewConfigCommand。
Query:GetReviewReportQuery、ListReviewReportsQuery、GetPeriodicReviewConfigQuery。
可信上下文:AuthenticatedUser,客户端 Body 中的 user_id 不能作为授权依据。
领域事件:GoalCompletedEvent 等已经认证、可幂等处理的事件。
允许离开复盘模块:
DTO:ReviewReportView、ReviewReportSummary、ReviewOperationResult。
领域事件:ReviewReady、ReviewGenerationFailed。
Outbound Port 调用:ReviewFactReader、ReviewNarrativeGenerator、ReviewRepository、ReviewOutbox。
0.4 禁止的跨边界依赖
ReviewUseCase -X-> SchedulingRepository / GoalRepository / FeedbackRepository
ReviewAgent -X-> ReviewRepository / FactQueryFacade / ReplanUseCase
MotherAI -X-> ReviewRepository / FactCalculator
Frontend -X-> FactCalculator / ReviewAgent
Reminder -X-> 修改 ReviewReport
Scheduler -X-> 直接创建 ReviewReport
用户采纳复盘建议时,必须创建新的用户交互并进入对应 Capability 的候选与确认流程;复盘模块不能直接执行建议。
1. 模块必须提供
1.1 复盘业务模块
函数(中文名称)
函数类型
调用方
函数输入(字段级别)
函数输出(字段级别)
失败 / 缺字段处理
函数功能文档
依赖数据
是否需要用户确认
是否写入
写入确认要求
生成或刷新目标复盘
业务命令
母 AI / API
可信用户上下文、goal_id、idempotency_key?
review_id、generation_status、revision、facts、poll_after_ms?
目标不存在或不属于用户时拒绝;无有效反馈时返回 no_reviewable_feedback
读取目标事实快照、计算事实、保存/刷新报告并提交 Agent 任务
FactSnapshot
一次性读取否;持久化策略待 Issue 确认
是
只写复盘模块数据
固化目标复盘
领域事件命令
GoalCompleted 事件消费者
event_id、user_id、goal_id、goal_version、completed_at
review_id?、lifecycle=finalized、revision
重复事件幂等返回;旧目标版本拒绝
生成最终事实并固化目标报告
FactSnapshot
否
是
只写复盘模块数据
生成周期复盘
业务命令
API / Scheduler
可信用户上下文、granularity、period_start/end、idempotency_key?
review_id?、generation_status、revision、empty?
周期未结束、边界不合法或无活动时返回受控结果
按用户时区自然窗口生成唯一周期报告
FactSnapshot
自动持久化策略待 Issue 确认
是
只写复盘模块数据
查询复盘报告
查询
母 AI / API / 前端 SDK
可信用户上下文、review_id
ReviewReportView
不存在或不属于用户时返回受控 NotFound/Forbidden
统一目标和周期报告详情入口
ReviewRepository
否
否
不涉及
查询复盘列表
查询
API / 前端 SDK
可信用户上下文、筛选、分页
ReviewReportSummary[]、分页信息
空列表返回空集合
查询历史报告入口
ReviewRepository
否
否
不涉及
重试复盘文字
业务命令
API / 前端 SDK
可信用户上下文、review_id、expected_revision
generation_status=generating、job_id
事实不存在、报告过期或 revision 冲突时拒绝
只重试文字,不重新计算事实
ReviewRepository
否
是
只写生成任务和报告状态
更新周期配置
业务命令
API / 前端 SDK
可信用户上下文、granularity、enabled、生成时间、expected_version
PeriodicReviewConfig
版本冲突或时区无效时拒绝
管理自动复盘策略,不删除历史报告
Identity 时区
显式设置动作
是
只写复盘模块配置
1.2 复盘 Agent Adapter
函数(中文名称)
函数类型
调用方
函数输入
函数输出
明确边界
生成复盘文字
AI Adapter
ReviewUseCase / Worker
facts_revision、facts、evidence_catalog[]、tone_policy、locale、prompt_version
ReviewNarrativeDraft、模型和 Prompt 元数据
不计算事实、不访问 Repository、不保存报告、不触发重排
1.3 前端交互与展示模块
函数(中文名称)
函数类型
调用方
函数输入(字段级别)
函数输出(字段级别)
失败 / 缺字段处理
函数功能文档
依赖数据
是否需要用户确认
是否写入
写入确认要求
获取复盘展示模型
查询
前端 SDK
review_id
ReviewReportView(header、sections[]、actions[]、empty_state?、warnings[])
单个统计块缺失时只隐藏对应 section;整体结构无效时返回错误状态
展示模型由复盘模块生成,前端不重新计算事实
ReviewReportView
否
否
不涉及
展示复盘报告
展示
前端交互与展示模块
ReviewReportView、page_context
render_status、user_action?
partial 时保留事实图表并显示文字重试入口;无数据时显示空状态
展示目标复盘或周期复盘页面
无
否
否
不涉及
展示复盘列表
展示
前端交互与展示模块
report_summaries[]、filter、pagination
render_status、selected_review_id?
列表为空时展示空状态;单条异常不阻断整页
展示目标复盘和周期复盘的历史入口
用户操作数据
否
否
不涉及
2. 模块依赖
2.1 入站调用者
调用者
调用复盘模块的能力
边界要求
母 AI / Capability Gateway
生成目标复盘、生成周期复盘、查询报告
只传 Command/Query,不组装 FactSnapshot、不保存报告
API / Frontend SDK
查询、生成、重试和配置
用户身份由服务端注入,页面只消费 DTO
Scheduler
生成到期周期复盘
只调用 ReviewUseCase,不直接创建报告
GoalCompleted 事件消费者
固化目标复盘
按 event_id 幂等处理
2.2 出站依赖 Port
Port
依赖原因
输入
输出
是否强依赖
ReviewFactReader
获取按用户、范围和用途裁剪的事实快照
GoalReviewQuery / PeriodicReviewQuery
FactSnapshot
是
ReviewNarrativeGenerator
基于事实和证据生成文字草稿
ReviewNarrativeRequest
ReviewNarrativeDraft
文字是,事实展示否
ReviewRepository
保存和查询复盘模块自有聚合
ReviewReport / 查询条件
报告或列表
需要历史报告时是
ReviewJobRepository
持久化异步生成任务
ReviewGenerationJob
Job 状态
异步生成时是
ReviewOutbox
发布报告就绪、生成失败等事件
ReviewDomainEvent
append 结果
通知联动时是
Clock
周期边界、过期和任务时间
无
当前时间
是
ReviewFactReader 的适配器可以调用 FactQueryFacade 及 Scheduling、Goal、Feedback、Replanning/Audit 的只读 Query Port;这些具体依赖不得泄漏到 timeflow.review。
3. 核心数据契约
3.1 复盘命令与范围
ReviewScope {
review_type enum(goal, periodic)
goal_id? string
period? {
start_at timestamp
end_at timestamp
time_zone string
granularity enum(day, week, month)
}
}
GenerateReviewCommand {
request_id string
user_id string // 由 CurrentUserContext 注入
scope ReviewScope
idempotency_key? string
locale string
}
目标不唯一、周期缺失或用户表达有歧义时,由母 AI 在调用 ReviewUseCase 前继续追问;ReviewUseCase 仍需重新校验用户归属、周期边界和业务前置条件。复盘 Agent 不负责 is_need_user。
3.2 事实快照
FactSnapshot {
snapshot_id string
user_id string
purpose literal(review)
read_scope string[]
facts {
items ReviewItemFact[]
feedbacks ReviewFeedbackFact[]
operation_logs ReviewOperationFact[]
}
source_versions SourceVersion[]
created_at timestamp
expires_at timestamp
}
SourceVersion {
aggregate_type string
aggregate_id string
version integer
updated_at timestamp
}
FactSnapshot 由 ReviewFactReader 获取,必须按用户、范围和 purpose=review 裁剪;不得包含数据库连接、访问令牌、无关用户画像、其他用户数据或无关备注全文。母 AI 和复盘 Agent 都不能自行读取或扩展快照。
3.3 复盘报告
ReviewReport {
review_id string
user_id string
review_type enum(goal, periodic)
scope ReviewScope
lifecycle enum(live, finalized)
generation_status enum(facts_ready, generating, ready, partial, failed)
facts GoalReviewFacts | PeriodicReviewFacts
evidence_catalog EvidenceRef[]
facts_schema_version string
facts_revision integer
narrative? ReviewNarrative
source_versions SourceVersion[]
revision integer
created_at timestamp
updated_at timestamp
}
目标进行中时允许刷新同一报告并增加 revision;目标完成后固化为 finalized。
周期报告以 (user_id, granularity, start_at, end_at, time_zone) 唯一。
重新生成文字不改变事实和周期边界。
Agent 结果只有在 facts_revision 仍匹配时才能写入。
3.4 复盘 Agent 输入与输出
ReviewNarrativeRequest {
request_id string
review_id string
review_type enum(goal, periodic)
facts_revision integer
facts_schema_version string
facts GoalReviewFacts | PeriodicReviewFacts
evidence_catalog EvidenceRef[]
tone_policy string
locale string
prompt_version string
}
ReviewNarrativeDraft {
status enum(ready, partial, failed)
narrative? ReviewNarrative
model_version string
prompt_version string
output_schema_version string
generation_errors string[]
}
Agent 请求不携带授权用途的 user_id、目标 Repository、原始数据客户端或业务命令。Agent 输出是未受信任的草稿,必须经过 NarrativeValidator 后才能进入 ReviewReport。
3.5 事实统计
GoalReviewFacts {
total_task_count
completed_task_count
incomplete_task_count
delayed_task_count
completion_rate?
duration_comparison[]
difficulty_distribution[]
incomplete_reason_distribution[]
replan_operation_stats
}
PeriodicReviewFacts {
schedule_stats
todo_stats
goal_task_stats
daily_distribution[]
active_goal_progress[]
incomplete_reason_distribution[]
replan_operation_stats
}
统计规则:
目标任务列表决定目标复盘的分母,不能使用反馈数量代替。
日程、待办和目标任务分别计算完成率,不生成无法解释的总体完成率。
分母为 0 时完成率返回 null,前端显示“—”。
未完成任务为 0 时不生成原因分布。
重排统计从用户操作原始记录计算,不读取重排 Agent 的解释文本。
3.6 文本与证据
EvidenceRef {
evidence_id string
metric_key string
display_value string
sample_size integer
source_fact_ids string[]
}
ReviewNarrative {
headline string
summary string
claims: Array<{ text, evidence_ids[] }>
suggestions: Array<{ title, action, evidence_ids[] }>
}
每条结论和建议至少引用一个有效 evidence_id。
LLM 不得输出证据中不存在的数字、时长、次数或日期。
建议最多 3 条,不能评价用户人格、意志力或心理状态。
文字校验失败时返回 partial,事实统计继续展示。
4. 调用流程
sequenceDiagram
actor U as 用户
participant FE as 前端交互与展示模块
participant M as 母 AI 编排模块
participant R as ReviewUseCase
participant F as ReviewFactReader
participant C as FactCalculator
participant DB as ReviewRepository
participant A as 复盘 Agent Adapter
participant V as NarrativeValidator
U->>FE: 请求复盘
FE->>M: 用户输入 + 页面上下文
M->>M: 确定目标或周期
alt 范围不明确
M-->>FE: 追问缺失信息
FE-->>U: 请求补充
else 范围明确
M->>R: GenerateReviewCommand
R->>F: 读取裁剪后的 FactSnapshot
F-->>R: 事实 + source_versions
R->>C: 计算 ReviewFacts + EvidenceCatalog
C-->>R: 确定性事实和证据
R->>DB: 保存 facts_revision 和生成任务
R->>A: ReviewNarrativeRequest
A-->>R: ReviewNarrativeDraft
R->>V: 校验数字、证据和建议边界
V-->>R: valid / validation_errors
R->>DB: CAS 保存 ready / partial
R-->>M: ReviewReportView
M-->>FE: ReviewReportView
FE-->>U: 展示复盘报告
end
Loading
周期自动复盘由 Scheduler → ReviewUseCase 触发,不经过母 AI;报告首次进入可查看状态后,由复盘模块写入 ReviewReady Outbox 事件,提醒模块消费事件并发送通知。
5. 数据展示
5.1 目标复盘页面
顺序
内容
展示形式
显示条件
1
完成情况
进度环 + 指标卡
始终显示
2
预计与实际耗时
横向对比图
至少一项有实际耗时
3
难度分布
条形图
至少一条反馈包含难度
4
未完成原因
条形图
未完成任务大于 0
5
重排操作
触发、接受、拒绝指标卡
存在重排操作记录
6
复盘总结
文字卡片
ready;partial 显示降级提示
7
后续建议
最多 3 条建议
存在有效建议
5.2 周期复盘页面
顺序
内容
展示形式
显示条件
1
日程、待办、目标任务统计
分组指标卡
始终显示
2
每日完成分布
柱状图
周报或月报
3
活跃目标进度
进度列表
周期内存在目标任务
4
未完成原因
条形图
存在完整目标任务反馈
5
重排操作
指标卡
存在重排操作记录
6
复盘总结
文字卡片
ready;partial 显示降级提示
7
后续建议
最多 3 条建议
存在有效建议
5.3 页面状态
状态
页面行为
loading
显示正在整理复盘数据
ready
展示事实、文字和建议
partial
展示事实,文字区域提示暂不可用并允许重试
no_reviewable_feedback
显示暂无可复盘的执行记录
no_activity
显示该周期暂无活动,不生成空报告
error
显示可重试错误,不展示过期结果
6. 架构骨架代码
from __future__ import annotations
from dataclasses import dataclass
from datetime import datetime
from typing import Literal , Mapping , Protocol , Sequence
@dataclass (frozen = True )
class AuthenticatedUser :
user_id : str
session_id : str
time_zone : str
@dataclass (frozen = True )
class GenerateGoalReviewCommand :
request_id : str
actor : AuthenticatedUser
goal_id : str
idempotency_key : str | None = None
locale : str = "zh-CN"
@dataclass (frozen = True )
class FactSnapshot :
snapshot_id : str
user_id : str
purpose : Literal ["review" ]
read_scope : tuple [str , ...]
facts : Mapping [str , object ]
source_versions : tuple [Mapping [str , object ], ...]
created_at : datetime
expires_at : datetime
@dataclass (frozen = True )
class CalculatedReview :
facts : Mapping [str , object ]
evidence_catalog : tuple [Mapping [str , object ], ...]
facts_schema_version : str
@dataclass (frozen = True )
class ReviewNarrativeRequest :
request_id : str
review_id : str
review_type : Literal ["goal" , "periodic" ]
facts_revision : int
facts_schema_version : str
facts : Mapping [str , object ]
evidence_catalog : tuple [Mapping [str , object ], ...]
tone_policy : str
locale : str
prompt_version : str
@dataclass (frozen = True )
class ReviewNarrativeDraft :
status : Literal ["ready" , "partial" , "failed" ]
narrative : Mapping [str , object ] | None
model_version : str
prompt_version : str
output_schema_version : str
generation_errors : tuple [str , ...] = ()
@dataclass (frozen = True )
class ReviewReport :
review_id : str
user_id : str
review_type : Literal ["goal" , "periodic" ]
lifecycle : Literal ["live" , "finalized" ]
generation_status : Literal [
"facts_ready" , "generating" , "ready" , "partial" , "failed"
]
facts : Mapping [str , object ]
evidence_catalog : tuple [Mapping [str , object ], ...]
facts_revision : int
revision : int
class ReviewFactReader (Protocol ):
async def goal_snapshot (
self , command : GenerateGoalReviewCommand
) -> FactSnapshot : ...
class FactCalculator (Protocol ):
def calculate_goal (self , snapshot : FactSnapshot ) -> CalculatedReview : ...
class ReviewNarrativeGenerator (Protocol ):
async def generate (
self , request : ReviewNarrativeRequest
) -> ReviewNarrativeDraft : ...
class NarrativeValidator (Protocol ):
def validate (
self ,
facts : Mapping [str , object ],
evidence_catalog : Sequence [Mapping [str , object ]],
draft : ReviewNarrativeDraft ,
) -> tuple [bool , tuple [str , ...]]: ...
class ReviewRepository (Protocol ):
async def get (self , user_id : str , review_id : str ) -> ReviewReport | None : ...
async def save (self , report : ReviewReport ) -> None : ...
class ReviewUnitOfWork (Protocol ):
reviews : ReviewRepository
async def __aenter__ (self ) -> "ReviewUnitOfWork" : ...
async def __aexit__ (self , exc_type , exc , tb ) -> None : ...
async def enqueue_generation (self , review_id : str , facts_revision : int ) -> None : ...
async def append_event (self , event : object ) -> None : ...
async def commit (self ) -> None : ...
class ReviewApplicationService :
def __init__ (
self ,
fact_reader : ReviewFactReader ,
calculator : FactCalculator ,
unit_of_work : ReviewUnitOfWork ,
) -> None :
self ._fact_reader = fact_reader
self ._calculator = calculator
self ._uow = unit_of_work
async def generate_goal_review (
self , command : GenerateGoalReviewCommand
) -> ReviewReport :
snapshot = await self ._fact_reader .goal_snapshot (command )
if snapshot .user_id != command .actor .user_id :
raise ReviewScopeForbiddenError ("fact snapshot user mismatch" )
if snapshot .purpose != "review" :
raise ReviewScopeInvalidError ("invalid fact snapshot purpose" )
calculated = self ._calculator .calculate_goal (snapshot )
report = build_or_refresh_goal_report (command , snapshot , calculated )
async with self ._uow :
await self ._uow .reviews .save (report )
await self ._uow .enqueue_generation (
report .review_id , report .facts_revision
)
await self ._uow .commit ()
return report
骨架 PR 至少包含:
真实 timeflow.review 包、核心实体、状态枚举和错误模型。
ReviewUseCase、ReviewFactReader、ReviewNarrativeGenerator、Repository、Job、Outbox Port。
GoalFactCalculator、PeriodicFactCalculator 和 NarrativeValidator。
In-memory Repository、Mock FactReader 和 Mock Narrative Generator。
bootstrap.py 中从入站 UseCase 到出站 Adapter 的真实装配。
至少一条“周期复盘 → 事实计算 → 保存报告 → Mock 文字 → ReviewReportView”的完整主干。
目标复盘、周期复盘、并发版本、跨用户、文字降级和通知失败集成测试。
timeflow.review 中不得导入其他业务模块的 Repository、具体数据库客户端、具体 LLM SDK 或通知 SDK。Adapter 可以依赖外部 SDK,但只能实现复盘模块定义的 Port。
7. 技术风险与验收
7.1 技术风险
风险
处理方式
FactSnapshot 过大
ReviewFactReader 按用途、范围和字段白名单裁剪;不传无关画像与备注全文
FactSnapshot 缺失或过期
校验 snapshot_id、expires_at 和 source_versions;关键事实不足时不调用 Agent
统计口径不一致
固定分子、分母和排除状态,使用契约测试验证
LLM 编造数字或原因
事实与文字分离,使用证据 ID 和代码后置校验
事项标题提示注入
用户文本作为 JSON 数据传入,不拼接为系统指令
生成时间过长
先返回事实统计;文字生成失败时降级为 partial
旧 Agent 覆盖新事实
生成任务携带 facts_revision;保存文字时使用 compare-and-set
目标完成与刷新竞态
根据 Goal version 和报告 lifecycle 固化;finalized 后拒绝旧 revision
周期边界重复或遗漏
使用用户时区和半开区间 [start_at, end_at),建立周期唯一键
通知重复或失败
ReviewReady 使用 Outbox 和事件幂等键;通知失败不回滚报告
7.2 验收标准
8. 函数英文名对照
所属模块
函数(中文名称)
函数英文名
复盘业务模块
生成或刷新目标复盘
generateGoalReview
复盘业务模块
固化目标复盘
finalizeGoalReview
复盘业务模块
生成周期复盘
generatePeriodicReview
复盘业务模块
查询复盘报告
getReviewReport
复盘业务模块
查询复盘列表
listReviewReports
复盘业务模块
重试复盘文字
retryReviewNarrative
复盘业务模块
更新周期配置
updatePeriodicReviewConfig
复盘业务模块
校验复盘文字
validateReviewNarrative
复盘业务模块
生成复盘展示模型
buildReviewReportView
复盘 Agent Adapter
生成复盘文字草稿
generateReviewNarrative
前端交互与展示模块
展示复盘报告
renderReviewReport
前端交互与展示模块
展示复盘列表
renderReviewList
复盘模块、复盘 Agent 与数据展示架构接口设计
本设计包含三个协作部分:
ReviewReportView并提交用户操作,不重新计算统计数据。母 AI 编排模块是交互入口之一,但不是复盘模块的数据聚合器、Repository、定时器或报告状态机。
核心约束:
ReviewReport、复盘事实、生成任务、周期配置和展示 DTO。ReviewFactReader获取按用途裁剪的FactSnapshot。ReviewUseCase。ReviewUseCase;提醒模块只消费ReviewReady事件。0. 复盘模块硬边界
0.1 边界以内
以下职责和数据必须位于
timeflow.review:ReviewUseCase:目标复盘、周期复盘、查询、重试和周期配置的业务入口。FactCalculator、EvidenceBuilder:确定性统计和证据目录。ReviewReport状态机及facts_revision/revision并发规则。ReviewGenerationJob、PeriodicReviewConfig。NarrativeValidator、ReviewReportViewBuilder。ReviewFactReader、ReviewNarrativeGenerator、ReviewRepository、ReviewOutbox等 Port 定义。复盘模块拥有的数据:
0.2 边界以外
ReviewUseCase,不读写报告AuthenticatedUserReviewNarrativeGeneratorReviewRepositoryReviewUseCase.generatePeriodicReviewReviewReady事件ReviewReportView0.3 允许穿越边界的契约
允许进入复盘模块:
GenerateGoalReviewCommand、GeneratePeriodicReviewCommand、RetryReviewNarrativeCommand、UpdatePeriodicReviewConfigCommand。GetReviewReportQuery、ListReviewReportsQuery、GetPeriodicReviewConfigQuery。AuthenticatedUser,客户端 Body 中的user_id不能作为授权依据。GoalCompletedEvent等已经认证、可幂等处理的事件。允许离开复盘模块:
ReviewReportView、ReviewReportSummary、ReviewOperationResult。ReviewReady、ReviewGenerationFailed。ReviewFactReader、ReviewNarrativeGenerator、ReviewRepository、ReviewOutbox。0.4 禁止的跨边界依赖
用户采纳复盘建议时,必须创建新的用户交互并进入对应 Capability 的候选与确认流程;复盘模块不能直接执行建议。
1. 模块必须提供
1.1 复盘业务模块
goal_id、idempotency_key?review_id、generation_status、revision、facts、poll_after_ms?no_reviewable_feedbackevent_id、user_id、goal_id、goal_version、completed_atreview_id?、lifecycle=finalized、revisiongranularity、period_start/end、idempotency_key?review_id?、generation_status、revision、empty?review_idReviewReportViewNotFound/ForbiddenReviewReportSummary[]、分页信息review_id、expected_revisiongeneration_status=generating、job_idgranularity、enabled、生成时间、expected_versionPeriodicReviewConfig1.2 复盘 Agent Adapter
ReviewUseCase/ Workerfacts_revision、facts、evidence_catalog[]、tone_policy、locale、prompt_versionReviewNarrativeDraft、模型和 Prompt 元数据1.3 前端交互与展示模块
review_idReviewReportView(header、sections[]、actions[]、empty_state?、warnings[])ReviewReportView、page_contextrender_status、user_action?partial时保留事实图表并显示文字重试入口;无数据时显示空状态report_summaries[]、filter、paginationrender_status、selected_review_id?2. 模块依赖
2.1 入站调用者
ReviewUseCase,不直接创建报告event_id幂等处理2.2 出站依赖 Port
ReviewFactReaderGoalReviewQuery/PeriodicReviewQueryFactSnapshotReviewNarrativeGeneratorReviewNarrativeRequestReviewNarrativeDraftReviewRepositoryReviewReport/ 查询条件ReviewJobRepositoryReviewGenerationJobReviewOutboxReviewDomainEventClockReviewFactReader的适配器可以调用 FactQueryFacade 及 Scheduling、Goal、Feedback、Replanning/Audit 的只读 Query Port;这些具体依赖不得泄漏到timeflow.review。3. 核心数据契约
3.1 复盘命令与范围
目标不唯一、周期缺失或用户表达有歧义时,由母 AI 在调用
ReviewUseCase前继续追问;ReviewUseCase仍需重新校验用户归属、周期边界和业务前置条件。复盘 Agent 不负责is_need_user。3.2 事实快照
FactSnapshot由ReviewFactReader获取,必须按用户、范围和purpose=review裁剪;不得包含数据库连接、访问令牌、无关用户画像、其他用户数据或无关备注全文。母 AI 和复盘 Agent 都不能自行读取或扩展快照。3.3 复盘报告
revision;目标完成后固化为finalized。(user_id, granularity, start_at, end_at, time_zone)唯一。facts_revision仍匹配时才能写入。3.4 复盘 Agent 输入与输出
Agent 请求不携带授权用途的
user_id、目标 Repository、原始数据客户端或业务命令。Agent 输出是未受信任的草稿,必须经过NarrativeValidator后才能进入ReviewReport。3.5 事实统计
统计规则:
null,前端显示“—”。3.6 文本与证据
evidence_id。partial,事实统计继续展示。4. 调用流程
sequenceDiagram actor U as 用户 participant FE as 前端交互与展示模块 participant M as 母 AI 编排模块 participant R as ReviewUseCase participant F as ReviewFactReader participant C as FactCalculator participant DB as ReviewRepository participant A as 复盘 Agent Adapter participant V as NarrativeValidator U->>FE: 请求复盘 FE->>M: 用户输入 + 页面上下文 M->>M: 确定目标或周期 alt 范围不明确 M-->>FE: 追问缺失信息 FE-->>U: 请求补充 else 范围明确 M->>R: GenerateReviewCommand R->>F: 读取裁剪后的 FactSnapshot F-->>R: 事实 + source_versions R->>C: 计算 ReviewFacts + EvidenceCatalog C-->>R: 确定性事实和证据 R->>DB: 保存 facts_revision 和生成任务 R->>A: ReviewNarrativeRequest A-->>R: ReviewNarrativeDraft R->>V: 校验数字、证据和建议边界 V-->>R: valid / validation_errors R->>DB: CAS 保存 ready / partial R-->>M: ReviewReportView M-->>FE: ReviewReportView FE-->>U: 展示复盘报告 end周期自动复盘由
Scheduler → ReviewUseCase触发,不经过母 AI;报告首次进入可查看状态后,由复盘模块写入ReviewReadyOutbox 事件,提醒模块消费事件并发送通知。5. 数据展示
5.1 目标复盘页面
ready;partial显示降级提示5.2 周期复盘页面
ready;partial显示降级提示5.3 页面状态
loadingreadypartialno_reviewable_feedbackno_activityerror6. 架构骨架代码
骨架 PR 至少包含:
timeflow.review包、核心实体、状态枚举和错误模型。ReviewUseCase、ReviewFactReader、ReviewNarrativeGenerator、Repository、Job、Outbox Port。GoalFactCalculator、PeriodicFactCalculator和NarrativeValidator。bootstrap.py中从入站 UseCase 到出站 Adapter 的真实装配。timeflow.review中不得导入其他业务模块的 Repository、具体数据库客户端、具体 LLM SDK 或通知 SDK。Adapter 可以依赖外部 SDK,但只能实现复盘模块定义的 Port。7. 技术风险与验收
7.1 技术风险
ReviewFactReader按用途、范围和字段白名单裁剪;不传无关画像与备注全文snapshot_id、expires_at和source_versions;关键事实不足时不调用 Agentpartialfacts_revision;保存文字时使用 compare-and-setfinalized后拒绝旧 revision[start_at, end_at),建立周期唯一键ReviewReady使用 Outbox 和事件幂等键;通知失败不回滚报告7.2 验收标准
ReviewUseCase进入复盘模块。timeflow.review不导入 Scheduling、Goal、Feedback 的 Repository 或具体 Adapter。ReviewFactReader返回按当前用户、范围和purpose=review裁剪的 FactSnapshot。partial,事实仍可展示。facts_revision的 Agent 结果不能覆盖已刷新报告。ReviewReady,通知失败不改变报告状态。ReviewReportView,不重新计算统计数据。8. 函数英文名对照
generateGoalReviewfinalizeGoalReviewgeneratePeriodicReviewgetReviewReportlistReviewReportsretryReviewNarrativeupdatePeriodicReviewConfigvalidateReviewNarrativebuildReviewReportViewgenerateReviewNarrativerenderReviewReportrenderReviewList