This repository has been archived on 2026-09-13. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
BPOS-MVP/apps/api/src/modules/report/CONTRACT.md
T
ChaiHaoandClaude Fable 5 9fce0fdaa0 三面拆分④:驾驶舱首页 —— 度量改接 report 真八指标,纠正率/DMN 不再恒为 0
治理台原先调 memory 的五指标版,还把 submissions/corrections/judgements
硬塞 0 —— 仪表在说谎。八指标本就在 report 里算好,这里接上,与工作台汇报同源同口径。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
2026-07-27 21:08:42 +08:00

2.1 KiB

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。 「治理台与工作台汇报同源同口径」这一条,从此在代码里也成立。