Archived
minute(纪要):工作台五要素里唯一的主动动作。 纪要本身不产生责任,唯一通往责任的路是决议经登记触发起单 —— 登记人即来源。 正文可续、决议只增;同一决议不重复起单(起单一刻已有一条带来源的流在跑)。 report(汇报):日/周/月/年对任务日志的聚合投影,零手工汇报。 未提交的草案每次取回都重算 —— 汇报是投影不是账本,提交那刻才固定为事实快照。 度量八指标落在这里(§4 注:度量是只读投影,不设独立模块): 自主率 / 纠正率 / 有效自主率 / 打扰率 / 断点率 / DMN 覆盖率 / 单位成本 / 终态分布。 口径全部挂归侧标签与事件流,零埋点;单位成本的分母只认放行通过。 周窗口以周一为首日,按 UTC 切分(单组织单时区)。 FactSource 只读 memory 与 task,一行都不另记 —— 五要素同源。 gates: tsc / eslint / depcruise(305 模块)/ api-report / 377 测试 全绿 日报已在真实系统上由 A1 任务日志聚合出来,含治理干预两行 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
51 lines
2.0 KiB
TypeScript
51 lines
2.0 KiB
TypeScript
/** 纪要领域:只增不改 + 决议登记不重复 —— domain 测试零 mock(OS 2.1 / 3.1) */
|
|
import { describe, expect, it } from 'vitest';
|
|
import { addResolution, markRegistered, newMinute, registeredWorkflowOf } from '../internal/domain/minute.ts';
|
|
|
|
const base = newMinute({
|
|
id: 'm1',
|
|
title: '7 月报价例会',
|
|
body: '讨论 Q3 报价口径',
|
|
authorId: 's-pm',
|
|
participants: ['s-pm', 's-bd'],
|
|
occurredOn: '2026-07-27',
|
|
resolutions: [{ id: 'r1', text: '统一 TYPE-B 的寻源时限为 3 天', ownerId: 's-prm' }],
|
|
at: '2026-07-27T02:00:00.000Z',
|
|
});
|
|
|
|
describe('纪要 —— 团队主动沉淀,本身不产生责任', () => {
|
|
it('新建的决议一律待登记', () => {
|
|
expect(base.resolutions.map((r) => r.state)).toEqual(['open']);
|
|
expect(registeredWorkflowOf(base, 'r1')).toBeUndefined();
|
|
});
|
|
|
|
it('决议只增不改 —— 追加不动既有条目', () => {
|
|
const next = addResolution(base, { id: 'r2', text: '新增一条' }, '2026-07-27T03:00:00.000Z');
|
|
expect(next.resolutions.map((r) => r.id)).toEqual(['r1', 'r2']);
|
|
expect(next.resolutions[0]).toEqual(base.resolutions[0]);
|
|
expect(next.updatedAt).toBe('2026-07-27T03:00:00.000Z');
|
|
});
|
|
});
|
|
|
|
describe('决议 → 登记起单:登记人即来源', () => {
|
|
const at = '2026-07-27T04:00:00.000Z';
|
|
const registered = markRegistered(base, 'r1', { workflowId: 'wf-9', byId: 's-pm', at })!;
|
|
|
|
it('登记落笔记下工作流与登记人', () => {
|
|
expect(registered.resolutions[0]).toMatchObject({
|
|
state: 'registered',
|
|
workflowId: 'wf-9',
|
|
registeredById: 's-pm',
|
|
registeredAt: at,
|
|
});
|
|
});
|
|
|
|
it('已登记的决议可被查出它起的那条流 —— 用例层据此拒绝重复起单', () => {
|
|
expect(registeredWorkflowOf(registered, 'r1')).toBe('wf-9');
|
|
});
|
|
|
|
it('不存在的决议返回 undefined,不静默改别的条目', () => {
|
|
expect(markRegistered(base, 'r-nope', { workflowId: 'wf-9', byId: 's-pm', at })).toBeUndefined();
|
|
});
|
|
});
|