# module: report 职责: 汇报(日/周/月/年)对任务日志的聚合投影;度量八指标的计算 不负责: 任务日志本身(见 memory)、终态与预算(见 task)—— 本模块**只读不写**这两处; 活动记忆与蒸馏(见 memory) 公开出口: index.ts - 类型:`ReportService` `Report` `ReportDraft` `ReportSection` `ReportPeriod` `Window` `Metrics` `LogFact` `TaskFact` - 错误:`ReportNotFoundError` `ReportAlreadySubmittedError` - 端口类型:`ReportStore` `FactSource` - 用例工厂:`createReportService(deps): ReportService` - 纯函数:`windowOf` `periodLabel` `draftReport` `computeMetrics`;常量 `REPORT_PERIODS` - adapter:`createReportStore`;Drizzle 表:`reports` 层级: L8(编码规范 §4) 依赖: @contracts;@shared/db;port:`FactSource`(memory L2 + task L6,由 app 注入) 被依赖: app(路由组装) 不变量(OS 2.1 / 8.1 / 8.3): - **零手工汇报**:草案的每一句都取自任务日志;员工唯一的手工位是确认前补的一段话 - **汇报是投影不是账本**:未提交的草案每次取回都重算;**提交那一刻**才固定为事实快照 - **确认即提交,提交后不再改**(`ReportAlreadySubmittedError`) - **口径挂归侧与事件流,零埋点**:输入只有归侧日志行与任务终态,没有第三种埋点 - **自主率与纠正率成对读**,复合为有效自主率 —— 单看任一都会被优化坏 - **单位成本的分母只认放行通过**:跑得多不等于产出多 - 度量是**只读投影**,不设独立模块(§4 注);治理台驾驶舱与工作台汇报同源同口径 - 周期窗口左闭右开、**周一为首日**、按 UTC 切分(单组织单时区) 近变(2026-07-27): - 模块面**未变**。app 层的 `GET /api/gov/metrics`(运营驾驶舱)改接本模块的 `metrics(undefined, period)` —— 此前它调 memory 的五指标版并把 submissions / corrections / judgements 硬塞 0,纠正率与 DMN 覆盖率结构性恒为 0。 「治理台与工作台汇报同源同口径」这一条,从此在代码里也成立。