create-principles-disciple 1.143.0 → 1.143.1
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.
- package/console/dist/server/index.js +19 -0
- package/console/dist/server/models/OwnerDecisionViewModel.d.ts +65 -0
- package/console/dist/server/models/OwnerDecisionViewModel.js +686 -0
- package/console/dist/server/routes/owner-decision.d.ts +40 -0
- package/console/dist/server/routes/owner-decision.js +88 -0
- package/console/dist/server/routes/principles.d.ts +3 -0
- package/console/dist/server/routes/principles.js +3 -0
- package/console/dist/ui/api.d.ts +7 -3
- package/console/dist/ui/api.js +13 -2
- package/console/dist/ui/i18n/en.json +70 -4
- package/console/dist/ui/i18n/zh-CN.json +70 -4
- package/console/dist/ui/pages/focus/FocusPage.js +25 -2
- package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +24 -0
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +168 -210
- package/console/dist/ui/pages/principles/PrinciplesPage.js +25 -10
- package/console/dist/ui/utils/enum-labels.d.ts +1 -1
- package/console/dist/ui/utils/enum-labels.js +8 -0
- package/console/dist/ui/utils/validators.d.ts +99 -1
- package/console/dist/ui/utils/validators.js +115 -0
- package/console/dist/web/assets/app.css +3 -0
- package/console/dist/web/assets/app.js +590 -349
- package/core/dist/runtime-v2/adapter/__tests__/principle-tree-ledger-adapter.test.js +25 -0
- package/core/dist/runtime-v2/adapter/__tests__/principle-tree-ledger-adapter.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts +16 -0
- package/core/dist/runtime-v2/adapter/principle-tree-ledger-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js +22 -0
- package/core/dist/runtime-v2/adapter/principle-tree-ledger-adapter.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +7 -0
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +4 -0
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/owner-decision/__tests__/owner-decision-view.test.d.ts +2 -0
- package/core/dist/runtime-v2/owner-decision/__tests__/owner-decision-view.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/owner-decision/__tests__/owner-decision-view.test.js +559 -0
- package/core/dist/runtime-v2/owner-decision/__tests__/owner-decision-view.test.js.map +1 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view-contract.d.ts +7868 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view-contract.d.ts.map +1 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view-contract.js +367 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view-contract.js.map +1 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view.d.ts +415 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view.d.ts.map +1 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view.js +856 -0
- package/core/dist/runtime-v2/owner-decision/owner-decision-view.js.map +1 -0
- package/core/dist/runtime-v2/owner-decision/semantic-selector.d.ts +72 -0
- package/core/dist/runtime-v2/owner-decision/semantic-selector.d.ts.map +1 -0
- package/core/dist/runtime-v2/owner-decision/semantic-selector.js +176 -0
- package/core/dist/runtime-v2/owner-decision/semantic-selector.js.map +1 -0
- package/package.json +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts +14 -0
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +47 -7
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.d.ts +84 -0
- package/pd-cli/dist/services/rulehost-pipeline-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/rulehost-pipeline-runner.js +215 -38
- package/pd-cli/dist/services/rulehost-pipeline-runner.js.map +1 -1
- package/plugin/dist/bundle.js +526 -526
- package/plugin/dist/governance-audit.js +205 -205
- package/plugin/dist/rulehost-evidence.js +246 -246
- package/release-manager/package.json +1 -1
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OwnerDecisionView derivation tests — Owner Decision Experience v1.
|
|
3
|
+
*
|
|
4
|
+
* Pure-derivation slices for T1/T2/T3/T4/T5/T7/T9/T10 (SPEC §17) plus the
|
|
5
|
+
* Semantic Selector v0 golden samples from the Phase 2 audit (§13 — the five
|
|
6
|
+
* canonical text forms; labels are TEST FIXTURES, not runtime inputs).
|
|
7
|
+
*/
|
|
8
|
+
import { describe, expect, it } from 'vitest';
|
|
9
|
+
import { deriveOwnerDecisionView, selectLearnedPrincipleV0, selectLearnedPrincipleV1, extractStandaloneBehaviorSentence, isWholeFieldHumanReadable } from '../../index.js';
|
|
10
|
+
const AS_OF = '2026-09-18T10:00:00.000Z';
|
|
11
|
+
function facts(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
schemaVersion: '1', principleId: 'p1', asOf: AS_OF,
|
|
14
|
+
lineage: { principleId: 'p1', artifactIds: ['artifact-1'], taskIds: [], revisionIdentities: [], confidence: 'strong', sourceRefs: [{ type: 'principle', id: 'p1' }] },
|
|
15
|
+
principle: { schemaVersion: '1', family: 'principle', sourceRef: { type: 'principle', id: 'p1' }, principleId: 'p1', lineageConfidence: 'strong', recordedAt: '2026-09-17T08:00:00.000Z', state: 'candidate' },
|
|
16
|
+
tasks: [], runnerVerdicts: [], derivedRelations: [], approvals: [], activations: [], timelineEvents: [], collectionIssues: [],
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function task(taskId, status, extra = {}) {
|
|
21
|
+
return {
|
|
22
|
+
schemaVersion: '1', family: 'task', sourceRef: { type: 'task', id: taskId }, principleId: 'p1',
|
|
23
|
+
taskId, lineageConfidence: 'strong', occurredAt: '2026-09-15T08:00:00.000Z', recordedAt: '2026-09-15T08:10:00.000Z',
|
|
24
|
+
taskKind: 'evaluator', channel: 'code_tool_hook', status, attemptCount: 1, maxAttempts: 3, ...extra,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function baseInputs(overrides = {}) {
|
|
28
|
+
return {
|
|
29
|
+
schemaVersion: '1', principleId: 'p1', asOf: AS_OF,
|
|
30
|
+
ledger: {
|
|
31
|
+
status: 'candidate', text: '主任务未完成前不得推进次要议题。', evaluability: 'weak_heuristic',
|
|
32
|
+
triggerPattern: '', action: '', derivedFromPainIds: ['cand-1'], ruleIds: [],
|
|
33
|
+
createdAt: '2026-09-13T00:00:00.000Z', updatedAt: '2026-09-13T00:00:00.000Z',
|
|
34
|
+
},
|
|
35
|
+
governance: facts(),
|
|
36
|
+
candidate: {
|
|
37
|
+
candidateId: 'cand-1', status: 'consumed', recommendationKind: 'principle',
|
|
38
|
+
description: '主任务未完成前不得推进次要议题。',
|
|
39
|
+
},
|
|
40
|
+
diagnosis: {
|
|
41
|
+
artifactId: 'art-1', summary: 'Agent 在主任务未完成时切换到次要议题。', rootCause: '缺乏焦点锚定机制。',
|
|
42
|
+
evidenceItems: [], truncated: false,
|
|
43
|
+
},
|
|
44
|
+
scribe: null,
|
|
45
|
+
philosopher: null,
|
|
46
|
+
applications: {
|
|
47
|
+
sourceStatus: 'available', deterministicCount: 0, selfReportedCount: 0, contextPresenceCount: 0,
|
|
48
|
+
windowDays: 90, recent: [],
|
|
49
|
+
},
|
|
50
|
+
coverageSourceStatus: 'available',
|
|
51
|
+
semanticSources: [
|
|
52
|
+
{ tier: 'candidate_principle', text: '主任务未完成前不得推进次要议题。', sourceVersion: 'cand-1' },
|
|
53
|
+
],
|
|
54
|
+
technicalRecommendationAvailable: false,
|
|
55
|
+
scribeMaterials: [],
|
|
56
|
+
piRootBound: true,
|
|
57
|
+
sourceReads: [{ source: 'ledger', status: 'available', capturedAt: AS_OF, scope: 'ledger entry' }],
|
|
58
|
+
...overrides,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ── Semantic Selector v0 golden samples (Phase 2 audit §13) ─────────────────
|
|
62
|
+
describe('Semantic Selector v0 — audit golden samples (§10.2)', () => {
|
|
63
|
+
const HUMAN = '主任务未完成前不得推进次要议题:行动焦点必须锚定 Owner 明确表达的当前目标,仅在其被验证完成或被 Owner 明确放下后才可切换。';
|
|
64
|
+
const ABSTRACT = "将'交付的定义必须内含主动验证'确立为跨场景交付类工作流(代码、文档、内容生产等)的原则:质量确认是执行者的自主职责,完成执行不等于验证成功,不得外置为对外部反馈的被动响应。具体'主动验证'形态需按领域重新定义。";
|
|
65
|
+
const TRIGGER = '当上下文已包含"所有子代理已完成/settled"类信号时,拦截后续 sessions_yield 调用。';
|
|
66
|
+
const MIXED = "将'源文件为准'确立为不可绕过的通用原则:任何跨会话/跨状态合并、同步或巡检动作,都必须以可观察的源对象(mtime+内容哈希)作为最终事实来源,禁止直接继承先前会话记忆或历史状态文件作为权威。";
|
|
67
|
+
const IMPLEMENTATION = '读取 source-of-truth.json 的 mtime 与 MD5 值,与 CURRENT_STATE.md 记录比对,不一致时通过 pre_check hook 阻止提交。';
|
|
68
|
+
it('whole-field qualification: human/abstract pass; trigger/mixed/implementation are rejected', () => {
|
|
69
|
+
expect(isWholeFieldHumanReadable(HUMAN)).toBe(true);
|
|
70
|
+
expect(isWholeFieldHumanReadable(ABSTRACT)).toBe(true);
|
|
71
|
+
expect(isWholeFieldHumanReadable(TRIGGER)).toBe(false); // sessions_yield snake_case
|
|
72
|
+
expect(isWholeFieldHumanReadable(MIXED)).toBe(false); // mtime + hash
|
|
73
|
+
expect(isWholeFieldHumanReadable(IMPLEMENTATION)).toBe(false); // .json/.md/MD5/hook
|
|
74
|
+
});
|
|
75
|
+
it('tier order: scribe beats distiller beats philosopher beats candidate', () => {
|
|
76
|
+
const result = selectLearnedPrincipleV0([
|
|
77
|
+
{ tier: 'candidate_principle', text: HUMAN, sourceVersion: 'cand' },
|
|
78
|
+
{ tier: 'distiller', text: ABSTRACT, sourceVersion: 'distiller' },
|
|
79
|
+
{ tier: 'scribe', text: '写入系统路径前必须确认目标不在系统保护目录。', sourceVersion: 'scribe-art' },
|
|
80
|
+
]);
|
|
81
|
+
expect(result.status).toBe('known');
|
|
82
|
+
if (result.status === 'known')
|
|
83
|
+
expect(result.sourceTier).toBe('scribe');
|
|
84
|
+
});
|
|
85
|
+
it('implementation-heavy description with no qualified alternative → UNKNOWN', () => {
|
|
86
|
+
const result = selectLearnedPrincipleV0([
|
|
87
|
+
{ tier: 'candidate_principle', text: IMPLEMENTATION, sourceVersion: 'cand' },
|
|
88
|
+
]);
|
|
89
|
+
expect(result).toMatchObject({ status: 'unknown', reasonCode: 'only_technical_recommendation_available' });
|
|
90
|
+
});
|
|
91
|
+
it('implementation kind falls back to its own abstractedPrinciple when qualified', () => {
|
|
92
|
+
const result = selectLearnedPrincipleV0([
|
|
93
|
+
{ tier: 'distiller', text: '修改状态类文件前必须核对真实来源。', sourceVersion: 'cand' },
|
|
94
|
+
{ tier: 'candidate_principle', text: IMPLEMENTATION, sourceVersion: 'cand' },
|
|
95
|
+
]);
|
|
96
|
+
expect(result.status).toBe('known');
|
|
97
|
+
if (result.status === 'known') {
|
|
98
|
+
expect(result.sourceTier).toBe('distiller');
|
|
99
|
+
expect(result.text).toBe('修改状态类文件前必须核对真实来源。');
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
it('no sources → UNKNOWN with explicit reason', () => {
|
|
103
|
+
expect(selectLearnedPrincipleV0([])).toMatchObject({ status: 'unknown', reasonCode: 'no_sources' });
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
// ── Semantic Selector v1 — bounded verbatim extraction (Phase D, §10.3) ─────
|
|
107
|
+
describe('Semantic Selector v1 — bounded extraction golden samples', () => {
|
|
108
|
+
it('extracts a verbatim standalone obligation sentence from a mixed field', () => {
|
|
109
|
+
const mixedText = '说明:本原则由诊断于 2026-09-13 生成,依据 source-of-truth.json 的 mtime 比对。任何跨会话的合并动作都必须以可观察的源对象作为最终事实来源。';
|
|
110
|
+
const sources = [{ tier: 'candidate_principle', text: mixedText, sourceVersion: 'cand-mixed' }];
|
|
111
|
+
const result = selectLearnedPrincipleV1(sources);
|
|
112
|
+
expect(result.status).toBe('known');
|
|
113
|
+
if (result.status === 'known') {
|
|
114
|
+
expect(result.selectionMode).toBe('extracted_sentence');
|
|
115
|
+
// Verbatim: the sentence appears in the source unchanged (no deletion,
|
|
116
|
+
// no generalization — negations/conditions ride along by construction).
|
|
117
|
+
expect(mixedText).toContain(result.text);
|
|
118
|
+
expect(result.text).toBe('任何跨会话的合并动作都必须以可观察的源对象作为最终事实来源。');
|
|
119
|
+
expect(result.text).not.toContain('mtime');
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
it('audit MIXED sample stays UNKNOWN when every sentence carries technical residue', () => {
|
|
123
|
+
const MIXED = "将'源文件为准'确立为不可绕过的通用原则:任何跨会话/跨状态合并、同步或巡检动作,都必须以可观察的源对象(mtime+内容哈希)作为最终事实来源,禁止直接继承先前会话记忆或历史状态文件作为权威。";
|
|
124
|
+
expect(selectLearnedPrincipleV1([{ tier: 'candidate_principle', text: MIXED, sourceVersion: 'c' }]))
|
|
125
|
+
.toMatchObject({ status: 'unknown' });
|
|
126
|
+
});
|
|
127
|
+
it('negations and conditions are preserved verbatim (no word deletion)', () => {
|
|
128
|
+
const sentence = '在主任务未完成或未被明确放下之前,不得切换行动焦点。';
|
|
129
|
+
const extracted = extractStandaloneBehaviorSentence([{
|
|
130
|
+
tier: 'distiller',
|
|
131
|
+
text: `背景补充:见 diagnosis_manual_1789317326914 记录。${sentence}`,
|
|
132
|
+
sourceVersion: 'd',
|
|
133
|
+
}]);
|
|
134
|
+
expect(extracted).not.toBeNull();
|
|
135
|
+
expect(extracted?.text).toBe(sentence);
|
|
136
|
+
});
|
|
137
|
+
it('single-sentence technical fields never gain extraction (no-op by design)', () => {
|
|
138
|
+
const TECH = '读取 source-of-truth.json 的 mtime 与 MD5 值并比对。';
|
|
139
|
+
expect(extractStandaloneBehaviorSentence([{ tier: 'distiller', text: TECH, sourceVersion: 'd' }])).toBeNull();
|
|
140
|
+
expect(selectLearnedPrincipleV1([{ tier: 'distiller', text: TECH, sourceVersion: 'd' }]))
|
|
141
|
+
.toMatchObject({ status: 'unknown' });
|
|
142
|
+
});
|
|
143
|
+
it('whole-field wins over extraction when both qualify', () => {
|
|
144
|
+
const whole = '主任务未完成前不得推进次要议题。';
|
|
145
|
+
const wholeResult = selectLearnedPrincipleV1([{ tier: 'candidate_principle', text: whole, sourceVersion: 'c' }]);
|
|
146
|
+
// When the whole field qualifies, the result is whole_field — extraction
|
|
147
|
+
// is only a fallback (checked directly; the mixed variant above covers
|
|
148
|
+
// the extraction path).
|
|
149
|
+
if (wholeResult.status === 'known')
|
|
150
|
+
expect(wholeResult.selectionMode).toBe('whole_field');
|
|
151
|
+
});
|
|
152
|
+
it('Codex P2: splits English sentences on period+space+capital for extraction', () => {
|
|
153
|
+
const enText = 'Generated from config.yaml diagnostics. Always ask the owner before deleting data.';
|
|
154
|
+
const extracted = extractStandaloneBehaviorSentence([{ tier: 'distiller', text: enText, sourceVersion: 'd-en' }]);
|
|
155
|
+
expect(extracted).not.toBeNull();
|
|
156
|
+
expect(extracted?.text).toBe('Always ask the owner before deleting data.');
|
|
157
|
+
});
|
|
158
|
+
it('does not split decimals or lowercase continuations', () => {
|
|
159
|
+
const text = 'The threshold is 3.5 units and must be respected.';
|
|
160
|
+
expect(extractStandaloneBehaviorSentence([{ tier: 'distiller', text, sourceVersion: 'd' }])).toBeNull();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
// ── Codex P1: per-subject revision gating (scribe material never borrowed) ──
|
|
164
|
+
describe('deriveOwnerDecisionView — per-subject readable-material gate (Codex P1)', () => {
|
|
165
|
+
const twoPending = facts({
|
|
166
|
+
approvals: [
|
|
167
|
+
{
|
|
168
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-scribe' }, principleId: 'p1',
|
|
169
|
+
artifactId: 'art-scribe', approvalId: 'apr-scribe', channel: 'prompt', outcome: 'pending',
|
|
170
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:00:00.000Z',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-unrelated' }, principleId: 'p1',
|
|
174
|
+
artifactId: 'art-unrelated', approvalId: 'apr-unrelated', channel: 'prompt', outcome: 'pending',
|
|
175
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:30:00.000Z',
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
});
|
|
179
|
+
function scribeInput(scribeMaterials) {
|
|
180
|
+
return baseInputs({
|
|
181
|
+
governance: twoPending,
|
|
182
|
+
semanticSources: scribeMaterials.map((entry) => ({ tier: 'scribe', text: entry.statement, sourceVersion: entry.artifactId })),
|
|
183
|
+
scribeMaterials: scribeMaterials.map((entry) => ({ ...entry, sourceVersion: entry.sourceVersion ?? entry.artifactId })),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
it('a pending subject on an unrelated revision is NOT approvable via another revision scribe text', () => {
|
|
187
|
+
const view = deriveOwnerDecisionView(scribeInput([
|
|
188
|
+
{ artifactId: 'art-scribe', statement: '主任务未完成前不得推进次要议题。' },
|
|
189
|
+
]));
|
|
190
|
+
const approveKeys = view.availableActions.filter((action) => action.semantic === 'approve').map((action) => action.key);
|
|
191
|
+
expect(approveKeys).toContain('approve:apr-scribe');
|
|
192
|
+
expect(approveKeys).not.toContain('approve:apr-unrelated');
|
|
193
|
+
// The unrelated subject still exposes an independently safe reject.
|
|
194
|
+
expect(view.availableActions.some((action) => action.key === 'reject:apr-unrelated')).toBe(true);
|
|
195
|
+
// And the gate blocker names the revision-material reason.
|
|
196
|
+
expect(view.blockers.some((blocker) => blocker.actionSemantic === 'approve' && blocker.subjectKey === 'apr-unrelated')).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
it('a rule artifact whose lineage carries the scribe artifact stays approvable', () => {
|
|
199
|
+
// Rule-path subjects are backed by their own scribe material entry: the
|
|
200
|
+
// collector emits one scribeMaterials entry per bound scribe artifact, and
|
|
201
|
+
// a rule artifact sharing that revision resolves to the same material.
|
|
202
|
+
const view = deriveOwnerDecisionView(scribeInput([
|
|
203
|
+
{ artifactId: 'art-scribe', statement: '主任务未完成前不得推进次要议题。' },
|
|
204
|
+
{ artifactId: 'art-unrelated', statement: '修改状态类文件前必须核对真实来源。' },
|
|
205
|
+
]));
|
|
206
|
+
const approveKeys = view.availableActions.filter((action) => action.semantic === 'approve').map((action) => action.key);
|
|
207
|
+
expect(approveKeys).toContain('approve:apr-scribe');
|
|
208
|
+
expect(approveKeys).toContain('approve:apr-unrelated');
|
|
209
|
+
});
|
|
210
|
+
it('distiller-tier material is candidate-wide (no per-subject restriction)', () => {
|
|
211
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
212
|
+
governance: twoPending,
|
|
213
|
+
semanticSources: [{ tier: 'distiller', text: '修改状态类文件前必须核对真实来源。', sourceVersion: 'cand-1' }],
|
|
214
|
+
scribeMaterials: [],
|
|
215
|
+
}));
|
|
216
|
+
const approveKeys = view.availableActions.filter((action) => action.semantic === 'approve').map((action) => action.key);
|
|
217
|
+
expect(approveKeys).toContain('approve:apr-scribe');
|
|
218
|
+
expect(approveKeys).toContain('approve:apr-unrelated');
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
// ── Fix 1 (review P1): subject-level decisionMaterial isolation ─────────────
|
|
222
|
+
describe('deriveOwnerDecisionView — subject decisionMaterial isolation (two revisions)', () => {
|
|
223
|
+
const twoScribeRevisions = facts({
|
|
224
|
+
approvals: [
|
|
225
|
+
{
|
|
226
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-v1' }, principleId: 'p1',
|
|
227
|
+
artifactId: 'art-v1', approvalId: 'apr-v1', channel: 'prompt', outcome: 'pending',
|
|
228
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:00:00.000Z',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-v2' }, principleId: 'p1',
|
|
232
|
+
artifactId: 'art-v2', approvalId: 'apr-v2', channel: 'prompt', outcome: 'pending',
|
|
233
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:30:00.000Z',
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
});
|
|
237
|
+
const TEXT_A = '修订一:写入系统目录前必须先通过路径白名单检查。';
|
|
238
|
+
const TEXT_B = '修订二:任何删除操作前必须取得 Owner 明确确认。';
|
|
239
|
+
function twoRevisionInput() {
|
|
240
|
+
return baseInputs({
|
|
241
|
+
governance: twoScribeRevisions,
|
|
242
|
+
semanticSources: [
|
|
243
|
+
{ tier: 'scribe', text: TEXT_A, sourceVersion: 'art-v1' },
|
|
244
|
+
{ tier: 'scribe', text: TEXT_B, sourceVersion: 'art-v2' },
|
|
245
|
+
],
|
|
246
|
+
scribeMaterials: [
|
|
247
|
+
{ artifactId: 'art-v1', statement: TEXT_A, rationale: '修订一的理由。', sourceVersion: 'art-v1' },
|
|
248
|
+
{ artifactId: 'art-v2', statement: TEXT_B, rationale: '修订二的理由。', sourceVersion: 'art-v2' },
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
it('each subject decisionMaterial shows ONLY its own revision text — no borrowing, no newest-wins', () => {
|
|
253
|
+
const view = deriveOwnerDecisionView(twoRevisionInput());
|
|
254
|
+
const v1 = view.decisionSubjects.find((subject) => subject.key === 'apr-v1');
|
|
255
|
+
const v2 = view.decisionSubjects.find((subject) => subject.key === 'apr-v2');
|
|
256
|
+
expect(v1).toBeDefined();
|
|
257
|
+
expect(v2).toBeDefined();
|
|
258
|
+
if (v1?.decisionMaterial.learnedPrinciple.status === 'known') {
|
|
259
|
+
expect(v1.decisionMaterial.learnedPrinciple.value[0]?.text).toBe(TEXT_A);
|
|
260
|
+
expect(v1.decisionMaterial.learnedPrinciple.value[0]?.text).not.toBe(TEXT_B);
|
|
261
|
+
}
|
|
262
|
+
else
|
|
263
|
+
throw new Error('v1 material must be known');
|
|
264
|
+
if (v2?.decisionMaterial.learnedPrinciple.status === 'known') {
|
|
265
|
+
expect(v2.decisionMaterial.learnedPrinciple.value[0]?.text).toBe(TEXT_B);
|
|
266
|
+
expect(v2.decisionMaterial.learnedPrinciple.value[0]?.text).not.toBe(TEXT_A);
|
|
267
|
+
}
|
|
268
|
+
else
|
|
269
|
+
throw new Error('v2 material must be known');
|
|
270
|
+
// Both are approvable — each on its own material.
|
|
271
|
+
const approveKeys = view.availableActions.filter((action) => action.semantic === 'approve').map((action) => action.key);
|
|
272
|
+
expect(approveKeys).toContain('approve:apr-v1');
|
|
273
|
+
expect(approveKeys).toContain('approve:apr-v2');
|
|
274
|
+
// Rationale is likewise subject-scoped.
|
|
275
|
+
if (v1.decisionMaterial.rationale.status === 'known') {
|
|
276
|
+
expect(v1.decisionMaterial.rationale.value[0]?.text).toContain('修订一');
|
|
277
|
+
}
|
|
278
|
+
if (v2.decisionMaterial.rationale.status === 'known') {
|
|
279
|
+
expect(v2.decisionMaterial.rationale.value[0]?.text).toContain('修订二');
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
it('principle-level learnedPrinciple remains the overview summary (newest tier selection) — unchanged contract', () => {
|
|
283
|
+
const view = deriveOwnerDecisionView(twoRevisionInput());
|
|
284
|
+
// The overview still exists for Library/principle context…
|
|
285
|
+
expect(view.learnedPrinciple.status).toBe('known');
|
|
286
|
+
// …and the decision block is where per-subject material lives.
|
|
287
|
+
for (const subject of view.decisionSubjects) {
|
|
288
|
+
expect(Object.hasOwn(subject, 'decisionMaterial')).toBe(true);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
it('a subject with no own scribe material gets UNKNOWN material, never a fallback', () => {
|
|
292
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
293
|
+
governance: facts({
|
|
294
|
+
approvals: [{
|
|
295
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-x' }, principleId: 'p1',
|
|
296
|
+
artifactId: 'art-orphan', approvalId: 'apr-x', channel: 'prompt', outcome: 'pending',
|
|
297
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:00:00.000Z',
|
|
298
|
+
}],
|
|
299
|
+
}),
|
|
300
|
+
semanticSources: [{ tier: 'scribe', text: TEXT_A, sourceVersion: 'art-v1' }],
|
|
301
|
+
scribeMaterials: [{ artifactId: 'art-v1', statement: TEXT_A, sourceVersion: 'art-v1' }],
|
|
302
|
+
}));
|
|
303
|
+
const subject = view.decisionSubjects.find((row) => row.key === 'apr-x');
|
|
304
|
+
expect(subject).toBeDefined();
|
|
305
|
+
expect(subject?.decisionMaterial.learnedPrinciple.status).toBe('unknown');
|
|
306
|
+
if (subject?.decisionMaterial.learnedPrinciple.status === 'unknown') {
|
|
307
|
+
expect(subject.decisionMaterial.learnedPrinciple.reason.ownerText).toContain('不能借用');
|
|
308
|
+
}
|
|
309
|
+
expect(view.availableActions.filter((action) => action.semantic === 'approve')).toHaveLength(0);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
// ── T2 / CASE-A shape: lineage unavailable, diagnosis readable ──────────────
|
|
313
|
+
describe('deriveOwnerDecisionView — T2 (lineage unavailable ≠ no_action)', () => {
|
|
314
|
+
const unboundFacts = facts({
|
|
315
|
+
lineage: { principleId: 'p1', artifactIds: [], taskIds: [], revisionIdentities: [], confidence: 'unknown', sourceRefs: [{ type: 'principle', id: 'p1' }] },
|
|
316
|
+
collectionIssues: [{ source: 'lineage', reasonCode: 'lineage_not_available', nextActionCode: 'wait_for_durable_lineage' }],
|
|
317
|
+
});
|
|
318
|
+
it('blocked (not no_action), with the diagnosis still displayed and labeled as PD interpretation', () => {
|
|
319
|
+
const view = deriveOwnerDecisionView(baseInputs({ governance: unboundFacts, piRootBound: false }));
|
|
320
|
+
expect(view.decisionState).toBe('blocked');
|
|
321
|
+
expect(view.blockers.some((blocker) => blocker.reason.code === 'lineage_not_available')).toBe(true);
|
|
322
|
+
expect(view.nextAction.ownerText).toContain('暂时无法');
|
|
323
|
+
// The readable diagnosis survives — but as PD interpretation, not observed fact.
|
|
324
|
+
expect(view.incidentSummary.status).toBe('known');
|
|
325
|
+
if (view.incidentSummary.status === 'known') {
|
|
326
|
+
expect(view.incidentSummary.value[0]?.text).toContain('PD 的事件概述');
|
|
327
|
+
expect(view.incidentSummary.value[0]?.claimClass).toBe('pd_interpretation');
|
|
328
|
+
}
|
|
329
|
+
// Enforcement and rollback cannot claim "none" without complete binding.
|
|
330
|
+
expect(view.currentEnforcement.status).toBe('unknown');
|
|
331
|
+
expect(view.rollback.status).toBe('unknown');
|
|
332
|
+
expect(view.availableActions.filter((action) => action.semantic === 'approve')).toHaveLength(0);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
// ── T1: candidate without pending approval ──────────────────────────────────
|
|
336
|
+
describe('deriveOwnerDecisionView — T1 (candidate ≠ waiting-for-owner-approval)', () => {
|
|
337
|
+
it('bound lineage, no pending, no work → no_action and NO approve action', () => {
|
|
338
|
+
const view = deriveOwnerDecisionView(baseInputs());
|
|
339
|
+
expect(view.decisionState).toBe('no_action');
|
|
340
|
+
expect(view.availableActions).toHaveLength(0);
|
|
341
|
+
expect(view.nextAction.ownerText).toContain('目前没有需要你决定的事项');
|
|
342
|
+
});
|
|
343
|
+
it('bound lineage with running work → processing, no approve fabricated', () => {
|
|
344
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
345
|
+
governance: facts({ tasks: [task('task-1', 'leased', { leaseExpiresAt: '2026-09-18T11:00:00.000Z' })] }),
|
|
346
|
+
}));
|
|
347
|
+
expect(view.decisionState).toBe('processing');
|
|
348
|
+
expect(view.availableActions.filter((action) => action.semantic === 'approve')).toHaveLength(0);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
// ── T5 + Material Gate: technical subject blocks approve, not reject ────────
|
|
352
|
+
describe('deriveOwnerDecisionView — T5 (Decision Material Gate)', () => {
|
|
353
|
+
const pendingApproval = facts({
|
|
354
|
+
approvals: [{
|
|
355
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-1' }, principleId: 'p1',
|
|
356
|
+
artifactId: 'artifact-1', approvalId: 'apr-1', channel: 'code_tool_hook', outcome: 'pending',
|
|
357
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-17T09:00:00.000Z',
|
|
358
|
+
}],
|
|
359
|
+
});
|
|
360
|
+
it('pending subject with human-readable material → needs_owner_decision with approve AND reject', () => {
|
|
361
|
+
const view = deriveOwnerDecisionView(baseInputs({ governance: pendingApproval }));
|
|
362
|
+
expect(view.decisionState).toBe('needs_owner_decision');
|
|
363
|
+
const semantics = view.availableActions.map((action) => action.semantic);
|
|
364
|
+
expect(semantics).toContain('approve');
|
|
365
|
+
expect(semantics).toContain('reject');
|
|
366
|
+
});
|
|
367
|
+
it('pending subject with ONLY technical text → blocked; approve absent, reject still independently available', () => {
|
|
368
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
369
|
+
governance: pendingApproval,
|
|
370
|
+
ledger: {
|
|
371
|
+
status: 'candidate', text: '读取 source-of-truth.json 的 mtime 与 MD5 值并比对。', evaluability: 'weak_heuristic',
|
|
372
|
+
triggerPattern: '', action: '', derivedFromPainIds: ['cand-1'], ruleIds: [],
|
|
373
|
+
createdAt: '2026-09-13T00:00:00.000Z', updatedAt: '2026-09-13T00:00:00.000Z',
|
|
374
|
+
},
|
|
375
|
+
candidate: {
|
|
376
|
+
candidateId: 'cand-1', status: 'consumed', recommendationKind: 'implementation',
|
|
377
|
+
description: '读取 source-of-truth.json 的 mtime 与 MD5 值并比对。',
|
|
378
|
+
},
|
|
379
|
+
semanticSources: [
|
|
380
|
+
{ tier: 'candidate_principle', text: '读取 source-of-truth.json 的 mtime 与 MD5 值并比对。', sourceVersion: 'cand-1' },
|
|
381
|
+
],
|
|
382
|
+
scribe: null,
|
|
383
|
+
}));
|
|
384
|
+
expect(view.decisionState).toBe('blocked');
|
|
385
|
+
expect(view.learnedPrinciple.status).toBe('unknown');
|
|
386
|
+
const approve = view.availableActions.filter((action) => action.semantic === 'approve');
|
|
387
|
+
expect(approve).toHaveLength(0);
|
|
388
|
+
const reject = view.availableActions.filter((action) => action.semantic === 'reject');
|
|
389
|
+
expect(reject).toHaveLength(1);
|
|
390
|
+
const gateBlocker = view.blockers.find((blocker) => blocker.actionSemantic === 'approve');
|
|
391
|
+
expect(gateBlocker?.reason.ownerText).toContain('缺少足够的信息');
|
|
392
|
+
});
|
|
393
|
+
it('expected consequence is concrete per channel and never claims live execution', () => {
|
|
394
|
+
const view = deriveOwnerDecisionView(baseInputs({ governance: pendingApproval }));
|
|
395
|
+
const approve = view.availableActions.find((action) => action.semantic === 'approve');
|
|
396
|
+
expect(approve).toBeDefined();
|
|
397
|
+
if (approve?.expectedConsequence.status === 'known') {
|
|
398
|
+
expect(approve.expectedConsequence.value[0]?.text).toContain('影子观察');
|
|
399
|
+
expect(approve.expectedConsequence.value[0]?.text).not.toContain('立即拦截');
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
// ── T3 / CASE-B shape: decided + deactivated + historical effect + old task ─
|
|
404
|
+
describe('deriveOwnerDecisionView — T3 (CASE-B composite)', () => {
|
|
405
|
+
const bFacts = facts({
|
|
406
|
+
principle: { schemaVersion: '1', family: 'principle', sourceRef: { type: 'principle', id: 'p1' }, principleId: 'p1', lineageConfidence: 'strong', recordedAt: '2026-09-15T08:00:00.000Z', state: 'active' },
|
|
407
|
+
approvals: [{
|
|
408
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-b' }, principleId: 'p1',
|
|
409
|
+
artifactId: 'artifact-1', approvalId: 'apr-b', channel: 'code_tool_hook', outcome: 'approved',
|
|
410
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-15T23:31:11.835Z', occurredAt: '2026-09-15T23:31:11.835Z',
|
|
411
|
+
}],
|
|
412
|
+
activations: [{
|
|
413
|
+
schemaVersion: '1', family: 'activation', sourceRef: { type: 'activation', id: 'act-b' }, principleId: 'p1',
|
|
414
|
+
artifactId: 'artifact-1', activationId: 'act-b', channel: 'code_tool_hook', outcome: 'deactivated',
|
|
415
|
+
activatedAt: '2026-09-17T07:45:01.379Z', deactivatedAt: '2026-09-17T07:54:41.687Z',
|
|
416
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-17T07:54:41.687Z',
|
|
417
|
+
}],
|
|
418
|
+
tasks: [task('task-failed', 'failed')],
|
|
419
|
+
timelineEvents: [],
|
|
420
|
+
});
|
|
421
|
+
it('shows approval history + deactivated enforcement + historical effect, without a generic do-not-approve', () => {
|
|
422
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
423
|
+
governance: bFacts,
|
|
424
|
+
ledger: { ...baseInputs().ledger, status: 'active' },
|
|
425
|
+
applications: {
|
|
426
|
+
sourceStatus: 'available', deterministicCount: 1, selfReportedCount: 0, contextPresenceCount: 2,
|
|
427
|
+
windowDays: 90,
|
|
428
|
+
recent: [{ text: '一次确定性拦截记录', createdAt: '2026-09-16T00:00:00.000Z', level: 'effect' }],
|
|
429
|
+
},
|
|
430
|
+
}));
|
|
431
|
+
// The approved subject is preserved as history.
|
|
432
|
+
expect(view.decisionSubjects.some((subject) => subject.state === 'approved')).toBe(true);
|
|
433
|
+
// Current enforcement shows deactivated — never "live".
|
|
434
|
+
expect(view.currentEnforcement.status).toBe('known');
|
|
435
|
+
if (view.currentEnforcement.status === 'known') {
|
|
436
|
+
expect(view.currentEnforcement.value?.state).toBe('deactivated');
|
|
437
|
+
expect(view.currentEnforcement.value?.items[0]?.active).toBe(false);
|
|
438
|
+
}
|
|
439
|
+
// Historical effect retained and NOT presented as current causation.
|
|
440
|
+
expect(view.evidenceSummary.status).toBe('known');
|
|
441
|
+
if (view.evidenceSummary.status === 'known') {
|
|
442
|
+
expect(view.evidenceSummary.value?.observation.deterministicEffects).toMatchObject({ status: 'known', value: 1 });
|
|
443
|
+
}
|
|
444
|
+
// The old runtime issue surfaces with the honest, relevance-unconfirmed copy.
|
|
445
|
+
const runtimeBlocker = view.blockers.find((blocker) => blocker.kind === 'runtime');
|
|
446
|
+
expect(runtimeBlocker?.reason.ownerText).toContain('尚未确认');
|
|
447
|
+
// No approve action is fabricated for an already-decided principle.
|
|
448
|
+
expect(view.availableActions.filter((action) => action.semantic === 'approve')).toHaveLength(0);
|
|
449
|
+
// No disable for the deactivated activation (§14).
|
|
450
|
+
expect(view.availableActions.filter((action) => action.semantic === 'disable')).toHaveLength(0);
|
|
451
|
+
// Rollback says: previously active, now deactivated — no stop action, no undo promise.
|
|
452
|
+
expect(view.rollback.status).toBe('known');
|
|
453
|
+
if (view.rollback.status === 'known') {
|
|
454
|
+
expect(view.rollback.value?.stopFuture.status).toBe('not_applicable');
|
|
455
|
+
expect(view.rollback.value?.undoPastExternalEffects.status).toBe('unknown');
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
it('a REAL pending approval outranks the historical recovery item (no false do-not-approve)', () => {
|
|
459
|
+
const withPending = facts({
|
|
460
|
+
...bFacts,
|
|
461
|
+
approvals: [...bFacts.approvals ?? [], {
|
|
462
|
+
schemaVersion: '1', family: 'approval', sourceRef: { type: 'approval', id: 'apr-new' }, principleId: 'p1',
|
|
463
|
+
artifactId: 'artifact-2', approvalId: 'apr-new', channel: 'prompt', outcome: 'pending',
|
|
464
|
+
lineageConfidence: 'strong', recordedAt: '2026-09-18T09:00:00.000Z',
|
|
465
|
+
}],
|
|
466
|
+
lineage: { ...bFacts.lineage, artifactIds: ['artifact-1', 'artifact-2'] },
|
|
467
|
+
});
|
|
468
|
+
const view = deriveOwnerDecisionView(baseInputs({ governance: withPending }));
|
|
469
|
+
expect(view.decisionState).toBe('needs_owner_decision');
|
|
470
|
+
expect(view.availableActions.some((action) => action.semantic === 'approve')).toBe(true);
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
// ── T4 / CASE-C: coverage available + zero records + one reference ──────────
|
|
474
|
+
describe('deriveOwnerDecisionView — T4 (evidence dimensions stay separate)', () => {
|
|
475
|
+
it('states all three facts explicitly; reference count is not behavior records', () => {
|
|
476
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
477
|
+
applications: { sourceStatus: 'available', deterministicCount: 0, selfReportedCount: 0, contextPresenceCount: 0, windowDays: 90, recent: [] },
|
|
478
|
+
coverageSourceStatus: 'available',
|
|
479
|
+
}));
|
|
480
|
+
expect(view.evidenceSummary.status).toBe('known');
|
|
481
|
+
if (view.evidenceSummary.status === 'known') {
|
|
482
|
+
const evidence = view.evidenceSummary.value;
|
|
483
|
+
expect(evidence).toBeDefined();
|
|
484
|
+
expect(evidence?.ownerExplanation).toContain('当前保留窗口内没有行为记录');
|
|
485
|
+
expect(evidence?.ownerExplanation).toContain('不能据此判断原则已经产生影响');
|
|
486
|
+
expect(evidence?.ownerExplanation).toContain('来源引用 1 条');
|
|
487
|
+
expect(evidence?.sourceAvailability).toMatchObject({ status: 'known', value: '行为记录来源可读取。' });
|
|
488
|
+
expect(evidence?.retainedBehaviorCount).toMatchObject({ status: 'known', value: 0 });
|
|
489
|
+
expect(evidence?.sourceReferenceCount).toMatchObject({ status: 'known', value: 1 });
|
|
490
|
+
expect(evidence?.governanceLineage).toMatchObject({ status: 'known', value: '已建立' });
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
// ── T7: no activation → no generic rollback promise ─────────────────────────
|
|
495
|
+
describe('deriveOwnerDecisionView — T7 (rollback honesty)', () => {
|
|
496
|
+
it('bound lineage with zero activations → stopFuture not_applicable, no "可回滚" claim', () => {
|
|
497
|
+
const view = deriveOwnerDecisionView(baseInputs());
|
|
498
|
+
expect(view.rollback.status).toBe('known');
|
|
499
|
+
if (view.rollback.status === 'known') {
|
|
500
|
+
expect(view.rollback.value?.stopFuture.status).toBe('not_applicable');
|
|
501
|
+
expect(view.rollback.value?.ownerText).toContain('无需撤销');
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
it('active activation → concrete disable capability with future-only scope', () => {
|
|
505
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
506
|
+
governance: facts({
|
|
507
|
+
activations: [{
|
|
508
|
+
schemaVersion: '1', family: 'activation', sourceRef: { type: 'activation', id: 'act-1' }, principleId: 'p1',
|
|
509
|
+
artifactId: 'artifact-1', activationId: 'act-1', channel: 'code_tool_hook', outcome: 'active',
|
|
510
|
+
activatedAt: '2026-09-17T07:45:01.379Z', lineageConfidence: 'strong', recordedAt: '2026-09-17T07:45:01.379Z',
|
|
511
|
+
}],
|
|
512
|
+
}),
|
|
513
|
+
}));
|
|
514
|
+
const disable = view.availableActions.find((action) => action.semantic === 'disable');
|
|
515
|
+
expect(disable).toBeDefined();
|
|
516
|
+
expect(disable?.confirmation.text).toContain('不会被撤回');
|
|
517
|
+
if (view.rollback.status === 'known') {
|
|
518
|
+
expect(view.rollback.value?.stopFuture.status).toBe('known');
|
|
519
|
+
if (view.rollback.value?.stopFuture.status === 'known') {
|
|
520
|
+
expect(view.rollback.value.stopFuture.value[0]?.text).toContain('今后的影响');
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
// ── T9/T10: source semantics + evaluability label separation ────────────────
|
|
526
|
+
describe('deriveOwnerDecisionView — T9/T10 (labels and semantics)', () => {
|
|
527
|
+
it('truncated diagnosis carries an explicit truncation warning', () => {
|
|
528
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
529
|
+
diagnosis: { artifactId: 'art-1', summary: '(部分)……', rootCause: 'x', evidenceItems: [], truncated: true },
|
|
530
|
+
}));
|
|
531
|
+
expect(view.uncertainty.status).toBe('known');
|
|
532
|
+
if (view.uncertainty.status === 'known') {
|
|
533
|
+
expect(view.uncertainty.value.some((item) => item.text.includes('截断'))).toBe(true);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
it('weak_heuristic evaluability is described as evaluability, never as low confidence', () => {
|
|
537
|
+
const view = deriveOwnerDecisionView(baseInputs());
|
|
538
|
+
if (view.uncertainty.status === 'known') {
|
|
539
|
+
const evaluabilityNote = view.uncertainty.value.find((item) => item.text.includes('弱启发式'));
|
|
540
|
+
expect(evaluabilityNote?.text).toContain('可评价性');
|
|
541
|
+
expect(JSON.stringify(view)).not.toContain('置信度:低');
|
|
542
|
+
expect(JSON.stringify(view)).not.toContain('confidence: low');
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
it('source_read_status=complete never fabricates lineage completeness', () => {
|
|
546
|
+
const view = deriveOwnerDecisionView(baseInputs({
|
|
547
|
+
governance: facts({
|
|
548
|
+
lineage: { principleId: 'p1', artifactIds: [], taskIds: [], revisionIdentities: [], confidence: 'unknown', sourceRefs: [{ type: 'principle', id: 'p1' }] },
|
|
549
|
+
collectionIssues: [{ source: 'lineage', reasonCode: 'lineage_not_available', nextActionCode: 'wait_for_durable_lineage' }],
|
|
550
|
+
}),
|
|
551
|
+
piRootBound: false,
|
|
552
|
+
}));
|
|
553
|
+
expect(view.sourceReadStatus).toBe('complete'); // reads succeeded…
|
|
554
|
+
expect(view.evidenceSummary.status === 'known'
|
|
555
|
+
&& view.evidenceSummary.value?.governanceLineage.status === 'known'
|
|
556
|
+
&& view.evidenceSummary.value.governanceLineage.value).toBe('未建立'); // …but lineage is honestly not established
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
//# sourceMappingURL=owner-decision-view.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-decision-view.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/owner-decision/__tests__/owner-decision-view.test.ts"],"names":[],"mappings":"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"}
|