@fantasticit/sumi 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +18 -18
  2. package/dist/adapters.d.ts +1 -0
  3. package/dist/adapters.js +13 -2
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/trace.d.ts +16 -0
  6. package/dist/trace.js +30 -0
  7. package/dist/trace.js.map +1 -0
  8. package/dist/visualize-page.d.ts +1 -1
  9. package/dist/visualize-page.js +2 -2
  10. package/dist/visualize.js +52 -8
  11. package/dist/visualize.js.map +1 -1
  12. package/node_modules/@sumi/create/dist/bin.d.ts +2 -0
  13. package/node_modules/@sumi/create/dist/bin.js +52 -0
  14. package/node_modules/@sumi/create/dist/bin.js.map +1 -0
  15. package/node_modules/@sumi/create/package.json +1 -1
  16. package/node_modules/@sumi/create/template/control/flows/check.flow.yaml +16 -0
  17. package/node_modules/@sumi/create/template/control/rubrics/behavior.yaml +17 -0
  18. package/node_modules/@sumi/create/template/control/rubrics/omission.yaml +13 -0
  19. package/node_modules/@sumi/kernel/package.json +2 -2
  20. package/node_modules/@sumi/plugin-sdk/README.md +1 -1
  21. package/node_modules/@sumi/plugin-sdk/dist/protocol.d.ts +2 -0
  22. package/node_modules/@sumi/plugin-sdk/dist/protocol.js.map +1 -1
  23. package/node_modules/@sumi/plugin-sdk/dist/trace.d.ts +1 -1
  24. package/node_modules/@sumi/plugin-sdk/dist/trace.js +15 -5
  25. package/node_modules/@sumi/plugin-sdk/dist/trace.js.map +1 -1
  26. package/node_modules/@sumi/plugin-sdk/dist/validate.js +2 -1
  27. package/node_modules/@sumi/plugin-sdk/dist/validate.js.map +1 -1
  28. package/node_modules/@sumi/plugin-sdk/package.json +1 -1
  29. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js +107 -15
  30. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js.map +1 -1
  31. package/node_modules/@sumi/plugins-core/dist/tool-batches.d.ts +11 -0
  32. package/node_modules/@sumi/plugins-core/dist/tool-batches.js +41 -0
  33. package/node_modules/@sumi/plugins-core/dist/tool-batches.js.map +1 -0
  34. package/node_modules/@sumi/plugins-core/package.json +2 -2
  35. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js +1 -0
  36. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js.map +1 -1
  37. package/node_modules/@sumi/plugins-governance/dist/hooks.d.ts +2 -0
  38. package/node_modules/@sumi/plugins-governance/dist/hooks.js +4 -0
  39. package/node_modules/@sumi/plugins-governance/dist/hooks.js.map +1 -0
  40. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js +3 -1
  41. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js.map +1 -1
  42. package/node_modules/@sumi/plugins-governance/package.json +2 -2
  43. package/node_modules/@sumi/plugins-openspec/package.json +4 -4
  44. package/node_modules/@sumi/plugins-precedent/package.json +3 -3
  45. package/node_modules/@sumi/plugins-review/README.md +18 -11
  46. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js +4 -1
  47. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js.map +1 -1
  48. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js +25 -10
  49. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js.map +1 -1
  50. package/node_modules/@sumi/plugins-review/dist/commands/submit.js +8 -1
  51. package/node_modules/@sumi/plugins-review/dist/commands/submit.js.map +1 -1
  52. package/node_modules/@sumi/plugins-review/dist/model-execution.d.ts +2 -1
  53. package/node_modules/@sumi/plugins-review/dist/model-execution.js +49 -18
  54. package/node_modules/@sumi/plugins-review/dist/model-execution.js.map +1 -1
  55. package/node_modules/@sumi/plugins-review/dist/model-independence.d.ts +2 -1
  56. package/node_modules/@sumi/plugins-review/dist/model-independence.js +13 -4
  57. package/node_modules/@sumi/plugins-review/dist/model-independence.js.map +1 -1
  58. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js +33 -13
  59. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js.map +1 -1
  60. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js +80 -6
  61. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js.map +1 -1
  62. package/node_modules/@sumi/plugins-review/dist/plugins/validation.d.ts +1 -0
  63. package/node_modules/@sumi/plugins-review/dist/plugins/validation.js +35 -0
  64. package/node_modules/@sumi/plugins-review/dist/plugins/validation.js.map +1 -0
  65. package/node_modules/@sumi/plugins-review/dist/recheck.d.ts +9 -5
  66. package/node_modules/@sumi/plugins-review/dist/recheck.js +30 -6
  67. package/node_modules/@sumi/plugins-review/dist/recheck.js.map +1 -1
  68. package/node_modules/@sumi/plugins-review/dist/review-evidence.d.ts +3 -0
  69. package/node_modules/@sumi/plugins-review/dist/review-evidence.js +58 -0
  70. package/node_modules/@sumi/plugins-review/dist/review-evidence.js.map +1 -0
  71. package/node_modules/@sumi/plugins-review/dist/review.d.ts +51 -1
  72. package/node_modules/@sumi/plugins-review/dist/review.js +142 -7
  73. package/node_modules/@sumi/plugins-review/dist/review.js.map +1 -1
  74. package/node_modules/@sumi/plugins-review/dist/submission.js +41 -3
  75. package/node_modules/@sumi/plugins-review/dist/submission.js.map +1 -1
  76. package/node_modules/@sumi/plugins-review/dist/validation-receipt.d.ts +8 -0
  77. package/node_modules/@sumi/plugins-review/dist/validation-receipt.js +110 -0
  78. package/node_modules/@sumi/plugins-review/dist/validation-receipt.js.map +1 -0
  79. package/node_modules/@sumi/plugins-review/package.json +4 -4
  80. package/node_modules/@sumi/plugins-review/sumi-plugins.yaml +7 -1
  81. package/package.json +10 -10
@@ -1,5 +1,6 @@
1
1
  import type { Finding } from '@sumi/plugin-sdk';
2
2
  import { type ModelIdentity, type ModelSource } from './model-execution.js';
3
+ import type { RecheckPolicy } from './model-independence.js';
3
4
  export interface RecheckIdentity {
4
5
  vendor: string;
5
6
  model: string;
@@ -8,10 +9,11 @@ export interface RecheckFinding extends Finding {
8
9
  identity: string;
9
10
  }
10
11
  export interface RecheckRequest {
12
+ policy?: RecheckPolicy;
11
13
  acceptedKey: string;
12
14
  acceptedDigest: string;
13
15
  contentDigest: string;
14
- original: ModelSource;
16
+ original: ModelSource | null;
15
17
  reviewer: RecheckIdentity;
16
18
  stepId: string;
17
19
  findings: RecheckFinding[];
@@ -26,8 +28,10 @@ export interface RecheckResult {
26
28
  }
27
29
  export interface AcceptedRecheck {
28
30
  result: RecheckResult;
29
- source: ModelIdentity;
31
+ source: ModelIdentity | null;
30
32
  }
33
+ /** 同一宿主会话可能容纳多个子代理,只有代理标识才能区分共享会话中的上下文。 */
34
+ export declare function recheckContext(original: ModelIdentity | null, reviewer: ModelIdentity | null): 'same' | 'different' | 'unverified';
31
35
  /** 身份包含原序号,避免同规则、甚至字段完全相同的两条 finding 被合并。 */
32
36
  export declare function buildRecheckRequest(input: Omit<RecheckRequest, 'findings'> & {
33
37
  findings: Finding[];
@@ -35,14 +39,14 @@ export declare function buildRecheckRequest(input: Omit<RecheckRequest, 'finding
35
39
  export declare function recheckKey(request: RecheckRequest): string;
36
40
  /** 返回首个错误;null 表示每条原 finding 恰有一条有效结论。 */
37
41
  export declare function validateRecheckResult(request: RecheckRequest, value: unknown): string | null;
38
- export declare function writeRecheck(root: string, request: RecheckRequest, result: RecheckResult, ticket: string, source: ModelIdentity): void;
42
+ export declare function writeRecheck(root: string, request: RecheckRequest, result: RecheckResult, ticket: string, source: ModelIdentity | null): void;
39
43
  export declare function readRecheck(root: string, request: RecheckRequest): AcceptedRecheck | null;
40
44
  /** 从同一次运行中读取原评审,并重新核对共享结果和模型来源。 */
41
- export declare function loadOriginalRecheckInput(root: string, runDir: string, sourceStepId: string): {
45
+ export declare function loadOriginalRecheckInput(root: string, runDir: string, sourceStepId: string, allowMissingSource?: boolean): {
42
46
  acceptedKey: string;
43
47
  acceptedDigest: string;
44
48
  contentDigest: string;
45
- original: ModelSource;
49
+ original: ModelSource | null;
46
50
  stepId: string;
47
51
  findings: Finding[];
48
52
  };
@@ -5,6 +5,16 @@ import { filesDigest, readAccepted, resultDigest, reviewsDir } from './review.js
5
5
  import { readModelSource, wasHostModelEventConsumed } from './model-execution.js';
6
6
  const digest = (value) => createHash('sha256').update(JSON.stringify(value)).digest('hex');
7
7
  const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ /** 同一宿主会话可能容纳多个子代理,只有代理标识才能区分共享会话中的上下文。 */
9
+ export function recheckContext(original, reviewer) {
10
+ if (!original || !reviewer)
11
+ return 'unverified';
12
+ if (original.host !== reviewer.host || original.sessionId !== reviewer.sessionId)
13
+ return 'different';
14
+ if (original.agentId && reviewer.agentId)
15
+ return original.agentId === reviewer.agentId ? 'same' : 'different';
16
+ return 'unverified';
17
+ }
8
18
  /** 身份包含原序号,避免同规则、甚至字段完全相同的两条 finding 被合并。 */
9
19
  export function buildRecheckRequest(input) {
10
20
  return {
@@ -52,10 +62,14 @@ export function writeRecheck(root, request, result, ticket, source) {
52
62
  const error = validateRecheckResult(request, result);
53
63
  if (error)
54
64
  throw new Error(error);
55
- if (source.vendor !== request.reviewer.vendor || source.model !== request.reviewer.model)
65
+ if (request.policy !== 'independent-context' && (!request.original || !source))
66
+ throw new Error('独立模型复核缺少宿主模型来源');
67
+ if (source && (source.vendor !== request.reviewer.vendor || source.model !== request.reviewer.model))
56
68
  throw new Error('复核宿主模型与目标模型不一致');
69
+ if (request.policy === 'independent-context' && recheckContext(request.original, source) === 'same')
70
+ throw new Error('原评审与复核使用同一宿主上下文');
57
71
  const key = recheckKey(request);
58
- if (!wasHostModelEventConsumed(root, ticket, 'model-recheck', source))
72
+ if (source && !wasHostModelEventConsumed(root, ticket, 'model-recheck', source))
59
73
  throw new Error('复核来源未绑定已消耗的宿主事件');
60
74
  writeFileSync(join(cacheDir(root), `${key}.json`), JSON.stringify({ key, ticket, source, result }, null, 2));
61
75
  }
@@ -70,13 +84,23 @@ export function readRecheck(root, request) {
70
84
  !/^[a-f0-9]{16}$/.test(value.ticket))
71
85
  return null;
72
86
  const source = value.source;
87
+ if (request.policy === 'independent-context') {
88
+ const ticket = JSON.parse(readFileSync(join(reviewsDir(root), 'recheck-tickets', `${value.ticket}.json`), 'utf8'));
89
+ if (!isRecord(ticket) || ticket.used !== true || ticket.key !== key || ticket.policy !== 'independent-context')
90
+ return null;
91
+ if (source === null)
92
+ return { result: value.result, source: null };
93
+ }
73
94
  if (!isRecord(source) ||
74
95
  source.vendor !== request.reviewer.vendor ||
75
96
  source.model !== request.reviewer.model ||
76
97
  typeof source.sessionId !== 'string' ||
98
+ (source.agentId !== undefined && (typeof source.agentId !== 'string' || !source.agentId || source.agentId.length > 512)) ||
77
99
  typeof source.eventId !== 'string' ||
78
- (source.host !== 'codex' && source.host !== 'claude') ||
79
- source.assurance !== (source.host === 'codex' ? 'tool-model' : 'session-model'))
100
+ (source.host !== 'codex' && source.host !== 'claude' && source.host !== 'cursor') ||
101
+ source.assurance !== (source.host === 'claude' ? 'session-model' : 'tool-model'))
102
+ return null;
103
+ if (request.policy === 'independent-context' && recheckContext(request.original, source) === 'same')
80
104
  return null;
81
105
  if (!wasHostModelEventConsumed(root, value.ticket, 'model-recheck', source))
82
106
  return null;
@@ -87,7 +111,7 @@ export function readRecheck(root, request) {
87
111
  }
88
112
  }
89
113
  /** 从同一次运行中读取原评审,并重新核对共享结果和模型来源。 */
90
- export function loadOriginalRecheckInput(root, runDir, sourceStepId) {
114
+ export function loadOriginalRecheckInput(root, runDir, sourceStepId, allowMissingSource = false) {
91
115
  if (!sourceStepId.split('/').every((part) => /^[a-zA-Z0-9_-]+$/.test(part)))
92
116
  throw new Error('原评审步骤 ID 不合法');
93
117
  const dir = join(runDir, sourceStepId);
@@ -116,7 +140,7 @@ export function loadOriginalRecheckInput(root, runDir, sourceStepId) {
116
140
  !fails.every((v) => step.findings.some((f) => f.rule.endsWith(`#${v.item}`) && f.message === v.reason && f.file === v.file && f.line === v.line)))
117
141
  throw new Error('原评审 finding 与已接受结论不一致');
118
142
  const original = readModelSource(root, receipt.key, accepted);
119
- if (!original)
143
+ if (!original && !allowMissingSource)
120
144
  throw new Error('原评审缺少代理宿主模型来源;请在已接入 hook 的代理会话中重新评审');
121
145
  return {
122
146
  acceptedKey: receipt.key,
@@ -1 +1 @@
1
- {"version":3,"file":"recheck.js","sourceRoot":"","sources":["../src/recheck.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recheck.js","sourceRoot":"","sources":["../src/recheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type PriorReview, type ValidationEvidence } from './review.js';
2
+ export declare function loadValidation(runDir: string, stepId: string): ValidationEvidence[];
3
+ export declare function loadPriorReview(root: string, runDir: string, stepId: string): PriorReview;
@@ -0,0 +1,58 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { readAccepted, resultDigest } from './review.js';
4
+ import { stepValidation } from './validation-receipt.js';
5
+ const safeStep = (step) => step.split('/').every((part) => /^[a-zA-Z0-9_-]+$/.test(part));
6
+ export function loadValidation(runDir, stepId) {
7
+ if (!safeStep(stepId))
8
+ throw new Error('关键验证步骤 ID 无效');
9
+ let entries;
10
+ try {
11
+ entries = JSON.parse(readFileSync(join(runDir, stepId, 'validation.json'), 'utf8'));
12
+ }
13
+ catch {
14
+ throw new Error(`关键验证 ${stepId} 尚无本次运行回执`);
15
+ }
16
+ if (!Array.isArray(entries) ||
17
+ !entries.every((entry) => entry &&
18
+ typeof entry.id === 'string' &&
19
+ typeof entry.step === 'string' &&
20
+ typeof entry.required === 'boolean' &&
21
+ typeof entry.state === 'string' &&
22
+ typeof entry.summary === 'string' &&
23
+ (entry.executionDigest === undefined ||
24
+ (typeof entry.executionDigest === 'string' && /^[a-f0-9]{64}$/.test(entry.executionDigest))) &&
25
+ (entry.sourceDigest === undefined || (typeof entry.sourceDigest === 'string' && /^[a-f0-9]{64}$/.test(entry.sourceDigest)))))
26
+ throw new Error(`关键验证 ${stepId} 回执格式无效`);
27
+ const current = entries.map(({ id, step, required }) => ({
28
+ id,
29
+ step,
30
+ required,
31
+ ...stepValidation(runDir, step),
32
+ }));
33
+ if (JSON.stringify(current) !== JSON.stringify(entries))
34
+ throw new Error(`关键验证 ${stepId} 的底层执行证据已变化`);
35
+ return entries;
36
+ }
37
+ export function loadPriorReview(root, runDir, stepId) {
38
+ if (!safeStep(stepId))
39
+ throw new Error('首轮评审步骤 ID 无效');
40
+ let step;
41
+ let receipt;
42
+ try {
43
+ step = JSON.parse(readFileSync(join(runDir, stepId, 'result.json'), 'utf8'));
44
+ receipt = JSON.parse(readFileSync(join(runDir, stepId, 'accepted-review.json'), 'utf8'));
45
+ }
46
+ catch {
47
+ throw new Error(`首轮评审 ${stepId} 尚无已接受结果`);
48
+ }
49
+ if (step.id !== stepId || step.use !== 'review/rubric' || step.state !== 'pass')
50
+ throw new Error(`首轮评审 ${stepId} 尚未通过`);
51
+ if (!/^[a-f0-9]{64}$/.test(receipt.key ?? '') || !/^[a-f0-9]{64}$/.test(receipt.resultDigest ?? ''))
52
+ throw new Error('首轮评审回执格式无效');
53
+ const accepted = readAccepted(root, receipt.key);
54
+ if (!accepted || resultDigest(accepted) !== receipt.resultDigest || accepted.verdicts.some((verdict) => verdict.verdict !== 'pass'))
55
+ throw new Error('首轮评审回执与已接受的通过结论不一致');
56
+ return { stepId, key: receipt.key, resultDigest: receipt.resultDigest, verdicts: accepted.verdicts };
57
+ }
58
+ //# sourceMappingURL=review-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-evidence.js","sourceRoot":"","sources":["../src/review-evidence.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,18 @@ export interface RubricItem {
8
8
  export interface Rubric {
9
9
  id: string;
10
10
  description?: string;
11
+ requireEvidence?: boolean;
12
+ areaDepth?: number;
11
13
  items: RubricItem[];
12
14
  }
13
15
  export interface RequestItem extends RubricItem {
14
16
  /** 本次评审该条目的文件范围。 */
15
17
  files: string[];
18
+ /** 需要逐区说明核查证据的文件分组。 */
19
+ areas?: {
20
+ id: string;
21
+ files: string[];
22
+ }[];
16
23
  }
17
24
  export interface ReviewRequest {
18
25
  key: string;
@@ -22,13 +29,39 @@ export interface ReviewRequest {
22
29
  contentDigest: string;
23
30
  repoRoot: string;
24
31
  items: RequestItem[];
32
+ requireEvidence?: boolean;
25
33
  impact?: ImpactRecord;
34
+ validationStep?: string;
35
+ validation?: ValidationEvidence[];
36
+ priorReview?: PriorReview;
37
+ }
38
+ export interface ValidationEvidence {
39
+ id: string;
40
+ step: string;
41
+ required: boolean;
42
+ state: string;
43
+ summary: string;
44
+ executionDigest?: string;
45
+ /** 同次运行的原始证据完整性;不进入跨运行复用键。 */
46
+ sourceDigest?: string;
47
+ }
48
+ export interface PriorReview {
49
+ stepId: string;
50
+ key: string;
51
+ resultDigest: string;
52
+ verdicts: Verdict[];
26
53
  }
27
54
  export interface Verdict {
28
55
  item: string;
29
56
  verdict: 'pass' | 'fail';
30
57
  reason: string;
31
58
  evidence?: string;
59
+ /** 只引用本次关键验证回执中确实通过的 suite ID。 */
60
+ testEvidence?: string[];
61
+ areaEvidence?: {
62
+ area: string;
63
+ evidence: string;
64
+ }[];
32
65
  uncertain?: boolean;
33
66
  file?: string;
34
67
  line?: number;
@@ -69,8 +102,16 @@ export declare function requestKey(parts: {
69
102
  items: {
70
103
  id: string;
71
104
  files: string[];
105
+ areas?: {
106
+ id: string;
107
+ files: string[];
108
+ }[];
72
109
  }[];
73
110
  impact?: ImpactRecord;
111
+ requireEvidence?: boolean;
112
+ validationStep?: string;
113
+ validation?: ValidationEvidence[];
114
+ priorReview?: PriorReview;
74
115
  }): string;
75
116
  /** 每一条业务影响判断分别评审,避免一条笼统的通过结论掩盖遗漏。 */
76
117
  export declare function impactRequestItems(record: ImpactRecord): RequestItem[];
@@ -86,8 +127,17 @@ export interface ReviewCoverage {
86
127
  items: {
87
128
  id: string;
88
129
  files: string[];
130
+ areas?: {
131
+ id: string;
132
+ files: string[];
133
+ }[];
89
134
  }[];
90
135
  blobs: Record<string, string>;
136
+ requireEvidence?: boolean;
137
+ validationStep?: string;
138
+ validation?: ValidationEvidence[];
139
+ testScopes?: Record<string, string>;
140
+ priorReview?: PriorReview;
91
141
  }
92
142
  /** 覆盖记录由准则摘要、条目文件与 blob 重算出的请求键;与记录的文件名不符时说明记录被改写或错配。 */
93
143
  export declare function coverageKey(coverage: ReviewCoverage): string;
@@ -98,7 +148,7 @@ export declare function writeCoverage(root: string, key: string, coverage: Revie
98
148
  * 用于已推送分支再推送时,门禁的增量范围复用工作区按配置基准(相对主干的全部改动)完成的评审。
99
149
  * 不通过的结果不按覆盖复用(理由可能针对范围外的文件),仍按键精确匹配。
100
150
  */
101
- export declare function findCoveringReview(root: string, rubricDigest: string, items: RequestItem[], blobs: Map<string, string>): {
151
+ export declare function findCoveringReview(root: string, rubricDigest: string, items: RequestItem[], blobs: Map<string, string>, constraints?: Pick<ReviewRequest, 'validationStep' | 'validation' | 'priorReview' | 'requireEvidence'>, targetScopes?: Record<string, string>): {
102
152
  key: string;
103
153
  result: ReviewResult;
104
154
  } | null;
@@ -60,8 +60,18 @@ export function applicableItems(rubric, files, forced) {
60
60
  const matched = item.scope?.length ? files.filter((f) => picomatch(item.scope, { dot: true })(f)) : files;
61
61
  const forcedFiles = forced.get(item.id);
62
62
  const scope = [...new Set([...(matched.length ? matched : []), ...(forcedFiles ?? [])])].sort();
63
- if (scope.length)
64
- out.push({ ...item, files: scope });
63
+ if (scope.length) {
64
+ const depth = rubric.areaDepth;
65
+ if (depth !== undefined && (!Number.isInteger(depth) || depth < 1 || depth > 8))
66
+ throw new Error(`评审准则 ${rubric.id} 的 areaDepth 必须是 1 到 8 的整数`);
67
+ const grouped = new Map();
68
+ if (depth)
69
+ for (const file of scope) {
70
+ const area = file.split('/').slice(0, depth).join('/');
71
+ grouped.set(area, [...(grouped.get(area) ?? []), file]);
72
+ }
73
+ out.push({ ...item, files: scope, ...(depth ? { areas: [...grouped].map(([id, paths]) => ({ id, files: paths })) } : {}) });
74
+ }
65
75
  }
66
76
  return out;
67
77
  }
@@ -71,8 +81,22 @@ export function requestKey(parts) {
71
81
  // 这样推送门禁(基准可能是空树或远端旧 OID)能复用工作区完成的评审。
72
82
  rubricDigest: parts.rubricDigest,
73
83
  contentDigest: parts.contentDigest,
74
- items: parts.items.map((i) => ({ id: i.id, files: i.files })),
84
+ items: parts.items.map((i) => ({ id: i.id, files: i.files, ...(i.areas ? { areas: i.areas } : {}) })),
75
85
  ...(parts.impact ? { impact: parts.impact } : {}),
86
+ ...(parts.requireEvidence ? { requireEvidence: true } : {}),
87
+ ...(parts.validationStep ? { validationStep: parts.validationStep } : {}),
88
+ ...(parts.validation
89
+ ? {
90
+ validation: parts.validation.map(({ id, step, required, state, summary, executionDigest }) => ({
91
+ id,
92
+ step,
93
+ required,
94
+ state,
95
+ ...(executionDigest ? { executionDigest, ...(step === 'core/test-affected' ? {} : { summary }) } : { summary }),
96
+ })),
97
+ }
98
+ : {}),
99
+ ...(parts.priorReview ? { priorReview: parts.priorReview } : {}),
76
100
  }));
77
101
  }
78
102
  /** 每一条业务影响判断分别评审,避免一条笼统的通过结论掩盖遗漏。 */
@@ -120,9 +144,31 @@ function isCoverage(v) {
120
144
  return (isRecord(v) &&
121
145
  typeof v.rubricDigest === 'string' &&
122
146
  Array.isArray(v.items) &&
123
- v.items.every((i) => isRecord(i) && typeof i.id === 'string' && isStrings(i.files)) &&
147
+ v.items.every((i) => isRecord(i) &&
148
+ typeof i.id === 'string' &&
149
+ isStrings(i.files) &&
150
+ (i.areas === undefined ||
151
+ (Array.isArray(i.areas) && i.areas.every((a) => isRecord(a) && typeof a.id === 'string' && isStrings(a.files))))) &&
124
152
  isRecord(v.blobs) &&
125
- Object.values(v.blobs).every((b) => typeof b === 'string'));
153
+ Object.values(v.blobs).every((b) => typeof b === 'string') &&
154
+ (v.requireEvidence === undefined || v.requireEvidence === true) &&
155
+ (v.validationStep === undefined || typeof v.validationStep === 'string') &&
156
+ (v.validation === undefined ||
157
+ (Array.isArray(v.validation) &&
158
+ v.validation.every((entry) => isRecord(entry) &&
159
+ typeof entry.id === 'string' &&
160
+ typeof entry.step === 'string' &&
161
+ typeof entry.required === 'boolean' &&
162
+ typeof entry.state === 'string' &&
163
+ typeof entry.summary === 'string' &&
164
+ (entry.executionDigest === undefined || typeof entry.executionDigest === 'string')))) &&
165
+ (v.testScopes === undefined || (isRecord(v.testScopes) && Object.values(v.testScopes).every((s) => typeof s === 'string'))) &&
166
+ (v.priorReview === undefined ||
167
+ (isRecord(v.priorReview) &&
168
+ typeof v.priorReview.stepId === 'string' &&
169
+ typeof v.priorReview.key === 'string' &&
170
+ typeof v.priorReview.resultDigest === 'string' &&
171
+ Array.isArray(v.priorReview.verdicts))));
126
172
  }
127
173
  /** 覆盖记录由准则摘要、条目文件与 blob 重算出的请求键;与记录的文件名不符时说明记录被改写或错配。 */
128
174
  export function coverageKey(coverage) {
@@ -131,6 +177,55 @@ export function coverageKey(coverage) {
131
177
  rubricDigest: coverage.rubricDigest,
132
178
  contentDigest: digestOfBlobs(files, coverage.blobs),
133
179
  items: coverage.items,
180
+ requireEvidence: coverage.requireEvidence,
181
+ validationStep: coverage.validationStep,
182
+ validation: coverage.validation,
183
+ priorReview: coverage.priorReview,
184
+ });
185
+ }
186
+ function testRows(raw, expected) {
187
+ if (!raw || !expected || sha256(raw) !== expected)
188
+ return null;
189
+ try {
190
+ const rows = JSON.parse(raw);
191
+ return Array.isArray(rows) &&
192
+ rows.length > 0 &&
193
+ rows.every((r) => isRecord(r) &&
194
+ typeof r.label === 'string' &&
195
+ typeof r.file === 'string' &&
196
+ Array.isArray(r.tests) &&
197
+ r.tests.every((t) => isRecord(t) && typeof t.name === 'string' && typeof t.status === 'string'))
198
+ ? rows
199
+ : null;
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ function validationCovered(source, target, targetScopes) {
206
+ if (source.requireEvidence !== target.requireEvidence ||
207
+ source.validationStep !== target.validationStep ||
208
+ JSON.stringify(source.priorReview) !== JSON.stringify(target.priorReview))
209
+ return false;
210
+ if (!source.validation && !target.validation)
211
+ return true;
212
+ if (!source.validation || !target.validation || source.validation.length !== target.validation.length)
213
+ return false;
214
+ return source.validation.every((from, index) => {
215
+ const to = target.validation[index];
216
+ if (!to || from.id !== to.id || from.step !== to.step || from.required !== to.required || from.state !== to.state)
217
+ return false;
218
+ if (from.step !== 'core/test-affected' || from.executionDigest === to.executionDigest)
219
+ return (requestKey({ rubricDigest: '', contentDigest: '', items: [], validation: [from] }) ===
220
+ requestKey({ rubricDigest: '', contentDigest: '', items: [], validation: [to] }));
221
+ if (from.state !== 'pass' || to.state !== 'pass')
222
+ return false;
223
+ const wide = testRows(source.testScopes?.[from.step], from.executionDigest);
224
+ const narrow = testRows(targetScopes[to.step], to.executionDigest);
225
+ if (!wide || !narrow)
226
+ return false;
227
+ const keys = new Set(wide.flatMap((r) => r.tests.map((t) => JSON.stringify([r.label, r.file, t.name, t.status]))));
228
+ return narrow.every((r) => r.tests.every((t) => keys.has(JSON.stringify([r.label, r.file, t.name, t.status]))));
134
229
  });
135
230
  }
136
231
  function coverageDir(root) {
@@ -147,7 +242,7 @@ export function writeCoverage(root, key, coverage) {
147
242
  * 用于已推送分支再推送时,门禁的增量范围复用工作区按配置基准(相对主干的全部改动)完成的评审。
148
243
  * 不通过的结果不按覆盖复用(理由可能针对范围外的文件),仍按键精确匹配。
149
244
  */
150
- export function findCoveringReview(root, rubricDigest, items, blobs) {
245
+ export function findCoveringReview(root, rubricDigest, items, blobs, constraints = {}, targetScopes = {}) {
151
246
  const dir = coverageDir(root);
152
247
  for (const name of readdirSync(dir)
153
248
  .filter((n) => n.endsWith('.json'))
@@ -160,10 +255,20 @@ export function findCoveringReview(root, rubricDigest, items, blobs) {
160
255
  const key = name.slice(0, -'.json'.length);
161
256
  if (coverageKey(coverage) !== key)
162
257
  continue;
258
+ const sourceFiles = [...new Set(coverage.items.flatMap((i) => i.files))];
259
+ if (Object.keys(coverage.blobs).length !== sourceFiles.length || sourceFiles.some((f) => !Object.hasOwn(coverage.blobs, f)))
260
+ continue;
261
+ const current = fileBlobs(root, sourceFiles);
262
+ if (sourceFiles.some((f) => current.get(f) !== coverage.blobs[f]))
263
+ continue;
264
+ if (!validationCovered(coverage, constraints, targetScopes))
265
+ continue;
163
266
  const covered = items.every((item) => {
164
267
  const reviewed = coverage.items.find((i) => i.id === item.id);
165
268
  return (reviewed &&
166
- item.files.every((f) => reviewed.files.includes(f) && Object.hasOwn(coverage.blobs, f) && coverage.blobs[f] === blobs.get(f)));
269
+ item.files.every((f) => reviewed.files.includes(f) && coverage.blobs[f] === blobs.get(f)) &&
270
+ (!item.areas ||
271
+ item.areas.every((area) => reviewed.areas?.some((a) => a.id === area.id && area.files.every((f) => a.files.includes(f))))));
167
272
  });
168
273
  if (!covered)
169
274
  continue;
@@ -209,10 +314,40 @@ export function validateReviewResult(request, value) {
209
314
  errors.push(`条目 ${item.id} 的 verdict 必须为 pass 或 fail`);
210
315
  else if (typeof v.reason !== 'string' || !v.reason.trim())
211
316
  errors.push(`条目 ${item.id} 缺少理由`);
317
+ else if (request.requireEvidence && v.verdict === 'pass' && (typeof v.evidence !== 'string' || !v.evidence.trim()))
318
+ errors.push(`条目 ${item.id} 通过时缺少核查证据`);
212
319
  else if (v.verdict === 'fail' && (typeof v.file !== 'string' || !v.file.trim()))
213
320
  errors.push(`条目 ${item.id} 判为 fail 时必须给出文件定位`);
214
321
  if (request.impact && item.id.startsWith('impact-') && (typeof v?.evidence !== 'string' || !v.evidence.trim()))
215
322
  errors.push(`条目 ${item.id} 缺少独立核查证据`);
323
+ if (v?.testEvidence !== undefined) {
324
+ if (!Array.isArray(v.testEvidence) || !v.testEvidence.every((id) => typeof id === 'string'))
325
+ errors.push(`条目 ${item.id} 的 testEvidence 必须是验证 ID 数组`);
326
+ else
327
+ for (const id of v.testEvidence) {
328
+ if (!request.validation?.some((entry) => entry.id === id && entry.state === 'pass'))
329
+ errors.push(`条目 ${item.id} 引用了本次未通过的关键验证 ${id}`);
330
+ }
331
+ }
332
+ if (v?.verdict === 'pass' && item.areas?.length) {
333
+ if (!Array.isArray(v.areaEvidence))
334
+ errors.push(`条目 ${item.id} 缺少逐区域核查证据`);
335
+ else {
336
+ const seenAreas = new Set();
337
+ for (const area of v.areaEvidence) {
338
+ if (!isRecord(area) || typeof area.area !== 'string' || typeof area.evidence !== 'string' || !area.evidence.trim()) {
339
+ errors.push(`条目 ${item.id} 的逐区域证据格式无效`);
340
+ continue;
341
+ }
342
+ if (seenAreas.has(area.area) || !item.areas.some((expected) => expected.id === area.area))
343
+ errors.push(`条目 ${item.id} 的区域 ${area.area} 重复或不适用`);
344
+ seenAreas.add(area.area);
345
+ }
346
+ for (const area of item.areas)
347
+ if (!seenAreas.has(area.id))
348
+ errors.push(`条目 ${item.id} 缺少区域 ${area.id} 的核查证据`);
349
+ }
350
+ }
216
351
  if (v?.uncertain === true && v.verdict !== 'fail')
217
352
  errors.push(`条目 ${item.id} 无法判定时必须判为 fail`);
218
353
  }
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}