@principles/core 1.97.0 → 1.99.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 (43) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +12 -0
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts +21 -0
  4. package/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts.map +1 -0
  5. package/dist/runtime-v2/__tests__/evidence-sanitizer.test.js +354 -0
  6. package/dist/runtime-v2/__tests__/evidence-sanitizer.test.js.map +1 -0
  7. package/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  8. package/dist/runtime-v2/config/pd-config-defaults.js +1 -0
  9. package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  10. package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts +18 -0
  11. package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts.map +1 -0
  12. package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js +277 -0
  13. package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js.map +1 -0
  14. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts +13 -0
  15. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts.map +1 -0
  16. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +264 -0
  17. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -0
  18. package/dist/runtime-v2/evidence-triage/index.d.ts +12 -0
  19. package/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -0
  20. package/dist/runtime-v2/evidence-triage/index.js +11 -0
  21. package/dist/runtime-v2/evidence-triage/index.js.map +1 -0
  22. package/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +48 -0
  23. package/dist/runtime-v2/evidence-triage/source-descriptors.d.ts.map +1 -0
  24. package/dist/runtime-v2/evidence-triage/source-descriptors.js +131 -0
  25. package/dist/runtime-v2/evidence-triage/source-descriptors.js.map +1 -0
  26. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts +32 -0
  27. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -0
  28. package/dist/runtime-v2/evidence-triage/triage-policy.js +95 -0
  29. package/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -0
  30. package/dist/runtime-v2/evidence-triage/types.d.ts +65 -0
  31. package/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -0
  32. package/dist/runtime-v2/evidence-triage/types.js +38 -0
  33. package/dist/runtime-v2/evidence-triage/types.js.map +1 -0
  34. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +10 -0
  35. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  36. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  37. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +1 -0
  38. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  39. package/dist/runtime-v2/index.d.ts +2 -0
  40. package/dist/runtime-v2/index.d.ts.map +1 -1
  41. package/dist/runtime-v2/index.js +1 -0
  42. package/dist/runtime-v2/index.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Source Descriptors Tests — PEAT-B1
3
+ *
4
+ * Direct tests for the source descriptor registry.
5
+ * This module defines the declarative policy mapping from SourceKind to default TriageDecision.
6
+ *
7
+ * Tests verify:
8
+ * - All source kinds have descriptors registered
9
+ * - Every descriptor has required fields (kind, defaultDecision, reason, nextAction, canUpgrade)
10
+ * - Descriptor invariants (owner_reported always admit, tool_failure never admit, etc.)
11
+ * - canUpgrade flag is correctly set for upgradable kinds
12
+ *
13
+ * ERR checklist:
14
+ * - ERR-002: Every descriptor carries reason + nextAction
15
+ * - ERR-005: Descriptors are data, not assumptions about callers
16
+ */
17
+ import { describe, it, expect } from 'vitest';
18
+ import { SOURCE_DESCRIPTORS, getSourceDescriptor, } from '../source-descriptors.js';
19
+ import { isSourceKind } from '../types.js';
20
+ // ── Descriptor Registry Completeness ───────────────────────────────────────────
21
+ describe('SOURCE_DESCRIPTORS registry', () => {
22
+ it('has exactly 13 registered descriptors', () => {
23
+ expect(SOURCE_DESCRIPTORS.size).toBe(13);
24
+ });
25
+ it('contains all valid SourceKinds', () => {
26
+ const expectedKinds = [
27
+ 'owner_reported',
28
+ 'agent_on_owner_request',
29
+ 'tool_failure',
30
+ 'dispatch_error',
31
+ 'provider_failure',
32
+ 'rate_limit',
33
+ 'rulehost_block',
34
+ 'empathy_inferred',
35
+ 'semantic',
36
+ 'llm_paralysis',
37
+ 'subagent_error',
38
+ 'gfi_threshold',
39
+ 'unknown',
40
+ ];
41
+ for (const kind of expectedKinds) {
42
+ expect(SOURCE_DESCRIPTORS.has(kind)).toBe(true);
43
+ }
44
+ });
45
+ it('every descriptor has all required fields', () => {
46
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
47
+ expect(descriptor.kind).toBe(kind);
48
+ expect(descriptor.defaultDecision).toBeDefined();
49
+ expect(typeof descriptor.defaultDecision).toBe('string');
50
+ expect(descriptor.reason).toBeDefined();
51
+ expect(typeof descriptor.reason).toBe('string');
52
+ expect(descriptor.reason.length).toBeGreaterThan(0);
53
+ expect(descriptor.nextAction).toBeDefined();
54
+ expect(typeof descriptor.nextAction).toBe('string');
55
+ expect(descriptor.nextAction.length).toBeGreaterThan(0);
56
+ expect(typeof descriptor.canUpgrade).toBe('boolean');
57
+ }
58
+ });
59
+ });
60
+ // ── getSourceDescriptor ───────────────────────────────────────────────────────
61
+ describe('getSourceDescriptor', () => {
62
+ it('returns descriptor for every registered kind', () => {
63
+ const kinds = [
64
+ 'owner_reported',
65
+ 'agent_on_owner_request',
66
+ 'tool_failure',
67
+ 'dispatch_error',
68
+ 'provider_failure',
69
+ 'rate_limit',
70
+ 'rulehost_block',
71
+ 'empathy_inferred',
72
+ 'semantic',
73
+ 'llm_paralysis',
74
+ 'subagent_error',
75
+ 'gfi_threshold',
76
+ 'unknown',
77
+ ];
78
+ for (const kind of kinds) {
79
+ const descriptor = getSourceDescriptor(kind);
80
+ expect(descriptor).toBeDefined();
81
+ expect(descriptor?.kind).toBe(kind);
82
+ }
83
+ });
84
+ it('returns undefined for unregistered kind', () => {
85
+ const result = getSourceDescriptor('not_a_kind');
86
+ expect(result).toBeUndefined();
87
+ });
88
+ it('returns undefined for empty string', () => {
89
+ const result = getSourceDescriptor('');
90
+ expect(result).toBeUndefined();
91
+ });
92
+ });
93
+ // ── Descriptor Decision Invariants ─────────────────────────────────────────────
94
+ describe('Descriptor decision invariants', () => {
95
+ it('owner_reported always has defaultDecision=admit', () => {
96
+ const descriptor = getSourceDescriptor('owner_reported');
97
+ expect(descriptor?.defaultDecision).toBe('admit');
98
+ });
99
+ it('agent_on_owner_request always has defaultDecision=admit', () => {
100
+ const descriptor = getSourceDescriptor('agent_on_owner_request');
101
+ expect(descriptor?.defaultDecision).toBe('admit');
102
+ });
103
+ it('tool_failure has defaultDecision=evidence_only (never admit)', () => {
104
+ const descriptor = getSourceDescriptor('tool_failure');
105
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
106
+ expect(descriptor?.defaultDecision).not.toBe('admit');
107
+ });
108
+ it('dispatch_error has defaultDecision=evidence_only', () => {
109
+ const descriptor = getSourceDescriptor('dispatch_error');
110
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
111
+ });
112
+ it('provider_failure has defaultDecision=health_only', () => {
113
+ const descriptor = getSourceDescriptor('provider_failure');
114
+ expect(descriptor?.defaultDecision).toBe('health_only');
115
+ });
116
+ it('rate_limit has defaultDecision=health_only', () => {
117
+ const descriptor = getSourceDescriptor('rate_limit');
118
+ expect(descriptor?.defaultDecision).toBe('health_only');
119
+ });
120
+ it('rulehost_block has defaultDecision=evidence_only with canUpgrade=true', () => {
121
+ const descriptor = getSourceDescriptor('rulehost_block');
122
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
123
+ expect(descriptor?.canUpgrade).toBe(true);
124
+ });
125
+ it('empathy_inferred has defaultDecision=owner_confirm (never directly admit)', () => {
126
+ const descriptor = getSourceDescriptor('empathy_inferred');
127
+ expect(descriptor?.defaultDecision).toBe('owner_confirm');
128
+ expect(descriptor?.defaultDecision).not.toBe('admit');
129
+ });
130
+ it('semantic has defaultDecision=evidence_only', () => {
131
+ const descriptor = getSourceDescriptor('semantic');
132
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
133
+ });
134
+ it('llm_paralysis has defaultDecision=evidence_only', () => {
135
+ const descriptor = getSourceDescriptor('llm_paralysis');
136
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
137
+ });
138
+ it('subagent_error has defaultDecision=evidence_only', () => {
139
+ const descriptor = getSourceDescriptor('subagent_error');
140
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
141
+ });
142
+ it('gfi_threshold has defaultDecision=evidence_only (GFI alone cannot admit)', () => {
143
+ const descriptor = getSourceDescriptor('gfi_threshold');
144
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
145
+ expect(descriptor?.defaultDecision).not.toBe('admit');
146
+ });
147
+ it('unknown has defaultDecision=evidence_only (conservative default)', () => {
148
+ const descriptor = getSourceDescriptor('unknown');
149
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
150
+ });
151
+ });
152
+ // ── canUpgrade Flag ────────────────────────────────────────────────────────────
153
+ describe('canUpgrade flag', () => {
154
+ it('only rulehost_block has canUpgrade=true', () => {
155
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
156
+ if (kind === 'rulehost_block') {
157
+ expect(descriptor.canUpgrade).toBe(true);
158
+ }
159
+ else {
160
+ expect(descriptor.canUpgrade).toBe(false);
161
+ }
162
+ }
163
+ });
164
+ it('owner_reported cannot be upgraded (highest confidence)', () => {
165
+ const descriptor = getSourceDescriptor('owner_reported');
166
+ expect(descriptor?.canUpgrade).toBe(false);
167
+ });
168
+ it('tool_failure cannot be upgraded (infrastructure noise)', () => {
169
+ const descriptor = getSourceDescriptor('tool_failure');
170
+ expect(descriptor?.canUpgrade).toBe(false);
171
+ });
172
+ it('empathy_inferred cannot be upgraded (requires owner confirmation)', () => {
173
+ const descriptor = getSourceDescriptor('empathy_inferred');
174
+ expect(descriptor?.canUpgrade).toBe(false);
175
+ });
176
+ });
177
+ // ── Descriptor Reason Quality ──────────────────────────────────────────────────
178
+ describe('Descriptor reason quality', () => {
179
+ it('owner_reported reason mentions highest confidence', () => {
180
+ const descriptor = getSourceDescriptor('owner_reported');
181
+ expect(descriptor?.reason.toLowerCase()).toContain('owner');
182
+ expect(descriptor?.reason.toLowerCase()).toContain('highest');
183
+ });
184
+ it('tool_failure reason mentions infrastructure or ADR-0014', () => {
185
+ const descriptor = getSourceDescriptor('tool_failure');
186
+ expect(descriptor?.reason.toLowerCase().includes('infrastructure') ||
187
+ descriptor?.reason.includes('ADR-0014')).toBe(true);
188
+ });
189
+ it('empathy_inferred reason mentions owner confirmation or PRODUCT_IDENTITY', () => {
190
+ const descriptor = getSourceDescriptor('empathy_inferred');
191
+ expect(descriptor?.reason.toLowerCase().includes('owner') ||
192
+ descriptor?.reason.includes('PRODUCT_IDENTITY')).toBe(true);
193
+ });
194
+ it('gfi_threshold reason mentions GFI alone cannot create diagnosis', () => {
195
+ const descriptor = getSourceDescriptor('gfi_threshold');
196
+ expect(descriptor?.reason.toLowerCase()).toContain('gfi');
197
+ expect(descriptor?.reason.toLowerCase()).toContain('alone');
198
+ });
199
+ it('rulehost_block reason mentions near-miss or evidence', () => {
200
+ const descriptor = getSourceDescriptor('rulehost_block');
201
+ expect(descriptor?.reason.toLowerCase().includes('near-miss') ||
202
+ descriptor?.reason.toLowerCase().includes('evidence')).toBe(true);
203
+ });
204
+ });
205
+ // ── Descriptor NextAction Quality ──────────────────────────────────────────────
206
+ describe('Descriptor nextAction quality', () => {
207
+ it('owner_reported nextAction is none (direct diagnosis)', () => {
208
+ const descriptor = getSourceDescriptor('owner_reported');
209
+ expect(descriptor?.nextAction).toBe('none');
210
+ });
211
+ it('agent_on_owner_request nextAction is none (direct diagnosis)', () => {
212
+ const descriptor = getSourceDescriptor('agent_on_owner_request');
213
+ expect(descriptor?.nextAction).toBe('none');
214
+ });
215
+ it('tool_failure nextAction mentions evidence or correlation', () => {
216
+ const descriptor = getSourceDescriptor('tool_failure');
217
+ expect(descriptor?.nextAction.toLowerCase()).toContain('evidence');
218
+ });
219
+ it('provider_failure nextAction mentions health or telemetry', () => {
220
+ const descriptor = getSourceDescriptor('provider_failure');
221
+ expect(descriptor?.nextAction.toLowerCase()).toContain('health');
222
+ });
223
+ it('empathy_inferred nextAction mentions owner confirmation', () => {
224
+ const descriptor = getSourceDescriptor('empathy_inferred');
225
+ expect(descriptor?.nextAction.toLowerCase()).toContain('owner');
226
+ });
227
+ it('unknown nextAction mentions classify', () => {
228
+ const descriptor = getSourceDescriptor('unknown');
229
+ expect(descriptor?.nextAction.toLowerCase()).toContain('classify');
230
+ });
231
+ });
232
+ // ── ReadonlyMap Immutability ───────────────────────────────────────────────────
233
+ describe('SOURCE_DESCRIPTORS immutability', () => {
234
+ it('SOURCE_DESCRIPTORS is a ReadonlyMap', () => {
235
+ // TypeScript enforces readonly, but runtime check ensures Map
236
+ expect(SOURCE_DESCRIPTORS instanceof Map).toBe(true);
237
+ });
238
+ it('descriptor objects are frozen or readonly', () => {
239
+ // Each descriptor should have readonly properties
240
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
241
+ // Attempting to modify should either fail or not affect original
242
+ const originalDecision = descriptor.defaultDecision;
243
+ // This test verifies the descriptor structure is correct
244
+ expect(descriptor.defaultDecision).toBe(originalDecision);
245
+ }
246
+ });
247
+ });
248
+ // ── Integration with isSourceKind ──────────────────────────────────────────────
249
+ describe('Integration with isSourceKind', () => {
250
+ it('every descriptor kind is a valid SourceKind', () => {
251
+ for (const [kind] of SOURCE_DESCRIPTORS) {
252
+ expect(isSourceKind(kind)).toBe(true);
253
+ }
254
+ });
255
+ it('descriptor lookup succeeds for all isSourceKind-valid values', () => {
256
+ const validKinds = [
257
+ 'owner_reported',
258
+ 'agent_on_owner_request',
259
+ 'tool_failure',
260
+ 'dispatch_error',
261
+ 'provider_failure',
262
+ 'rate_limit',
263
+ 'rulehost_block',
264
+ 'empathy_inferred',
265
+ 'semantic',
266
+ 'llm_paralysis',
267
+ 'subagent_error',
268
+ 'gfi_threshold',
269
+ 'unknown',
270
+ ];
271
+ for (const kind of validKinds) {
272
+ expect(isSourceKind(kind)).toBe(true);
273
+ expect(getSourceDescriptor(kind)).toBeDefined();
274
+ }
275
+ });
276
+ });
277
+ //# sourceMappingURL=source-descriptors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-descriptors.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/evidence-triage/__tests__/source-descriptors.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,kFAAkF;AAElF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,aAAa,GAAiB;YAClC,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAiB;YAC1B,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAA0B,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC3D,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACtD,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,8DAA8D;QAC9D,MAAM,CAAC,kBAAkB,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,kDAAkD;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,UAAU,CAAC,eAAe,CAAC;YACpD,yDAAyD;YACzD,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG;YACjB,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACD,CAAC;QAEX,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Triage Policy Tests — PEAT-B1
3
+ *
4
+ * Tests the pure triage policy evaluation.
5
+ * No I/O, no plugin imports, no mocks needed.
6
+ *
7
+ * ERR checklist:
8
+ * - ERR-001: Validates that source kind is runtime-checked, not cast.
9
+ * - ERR-002: Validates that every result has reason + nextAction.
10
+ * - ERR-024/025/048: Tests exercise the production evaluateTriage path.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=triage-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-policy.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/evidence-triage/__tests__/triage-policy.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Triage Policy Tests — PEAT-B1
3
+ *
4
+ * Tests the pure triage policy evaluation.
5
+ * No I/O, no plugin imports, no mocks needed.
6
+ *
7
+ * ERR checklist:
8
+ * - ERR-001: Validates that source kind is runtime-checked, not cast.
9
+ * - ERR-002: Validates that every result has reason + nextAction.
10
+ * - ERR-024/025/048: Tests exercise the production evaluateTriage path.
11
+ */
12
+ import { describe, it, expect } from 'vitest';
13
+ import { evaluateTriage } from '../triage-policy.js';
14
+ import { isSourceKind } from '../types.js';
15
+ import { getSourceDescriptor, SOURCE_DESCRIPTORS } from '../source-descriptors.js';
16
+ // ── Helper ──────────────────────────────────────────────────────────────────
17
+ function makeInput(overrides = {}) {
18
+ return {
19
+ sourceKind: 'unknown',
20
+ score: 50,
21
+ ...overrides,
22
+ };
23
+ }
24
+ function assertHasReasonAndNextAction(result) {
25
+ expect(result.reason).toBeTruthy();
26
+ expect(result.reason.length).toBeGreaterThan(0);
27
+ expect(result.nextAction).toBeTruthy();
28
+ expect(result.nextAction.length).toBeGreaterThan(0);
29
+ }
30
+ // ── Source Kind Validation ───────────────────────────────────────────────────
31
+ describe('isSourceKind', () => {
32
+ it('accepts valid source kinds', () => {
33
+ expect(isSourceKind('owner_reported')).toBe(true);
34
+ expect(isSourceKind('tool_failure')).toBe(true);
35
+ expect(isSourceKind('empathy_inferred')).toBe(true);
36
+ expect(isSourceKind('unknown')).toBe(true);
37
+ });
38
+ it('rejects invalid source kinds', () => {
39
+ expect(isSourceKind('not_a_kind')).toBe(false);
40
+ expect(isSourceKind('')).toBe(false);
41
+ expect(isSourceKind(null)).toBe(false);
42
+ expect(isSourceKind(undefined)).toBe(false);
43
+ expect(isSourceKind(42)).toBe(false);
44
+ });
45
+ });
46
+ // ── Source Descriptors ───────────────────────────────────────────────────────
47
+ describe('getSourceDescriptor', () => {
48
+ it('returns descriptor for every registered kind', () => {
49
+ const kinds = [
50
+ 'owner_reported', 'agent_on_owner_request', 'tool_failure', 'dispatch_error',
51
+ 'provider_failure', 'rate_limit', 'rulehost_block', 'empathy_inferred',
52
+ 'semantic', 'llm_paralysis', 'subagent_error', 'gfi_threshold', 'unknown',
53
+ ];
54
+ for (const kind of kinds) {
55
+ const desc = getSourceDescriptor(kind);
56
+ expect(desc).toBeDefined();
57
+ if (!desc)
58
+ throw new Error(`descriptor missing for ${kind}`);
59
+ expect(desc.kind).toBe(kind);
60
+ }
61
+ });
62
+ it('returns undefined for unregistered kind', () => {
63
+ // isSourceKind would return false for this, but descriptor lookup still works
64
+ const fakeKind = 'not_a_kind';
65
+ expect(getSourceDescriptor(fakeKind)).toBeUndefined();
66
+ });
67
+ it('has exactly 13 registered descriptors', () => {
68
+ expect(SOURCE_DESCRIPTORS.size).toBe(13);
69
+ });
70
+ });
71
+ // ── Owner-Reported Pain ─────────────────────────────────────────────────────
72
+ describe('owner_reported', () => {
73
+ it('admits with direct diagnosis', () => {
74
+ const result = evaluateTriage(makeInput({ sourceKind: 'owner_reported', score: 100 }));
75
+ expect(result.decision).toBe('admit');
76
+ expect(result.sourceKind).toBe('owner_reported');
77
+ assertHasReasonAndNextAction(result);
78
+ });
79
+ it('admits regardless of score', () => {
80
+ const result = evaluateTriage(makeInput({ sourceKind: 'owner_reported', score: 10 }));
81
+ expect(result.decision).toBe('admit');
82
+ });
83
+ });
84
+ describe('agent_on_owner_request', () => {
85
+ it('admits with direct diagnosis', () => {
86
+ const result = evaluateTriage(makeInput({ sourceKind: 'agent_on_owner_request', score: 90 }));
87
+ expect(result.decision).toBe('admit');
88
+ assertHasReasonAndNextAction(result);
89
+ });
90
+ });
91
+ // ── Tool Failure ─────────────────────────────────────────────────────────────
92
+ describe('tool_failure', () => {
93
+ it('defaults to evidence_only', () => {
94
+ const result = evaluateTriage(makeInput({ sourceKind: 'tool_failure', score: 70 }));
95
+ expect(result.decision).toBe('evidence_only');
96
+ assertHasReasonAndNextAction(result);
97
+ });
98
+ it('does not admit regardless of score', () => {
99
+ const high = evaluateTriage(makeInput({ sourceKind: 'tool_failure', score: 95 }));
100
+ expect(high.decision).toBe('evidence_only');
101
+ const low = evaluateTriage(makeInput({ sourceKind: 'tool_failure', score: 10 }));
102
+ expect(low.decision).toBe('evidence_only');
103
+ });
104
+ });
105
+ // ── Dispatch Error ───────────────────────────────────────────────────────────
106
+ describe('dispatch_error', () => {
107
+ it('defaults to evidence_only', () => {
108
+ const result = evaluateTriage(makeInput({ sourceKind: 'dispatch_error', score: 50 }));
109
+ expect(result.decision).toBe('evidence_only');
110
+ assertHasReasonAndNextAction(result);
111
+ });
112
+ });
113
+ // ── Provider / Rate Limit ───────────────────────────────────────────────────
114
+ describe('provider_failure', () => {
115
+ it('defaults to health_only', () => {
116
+ const result = evaluateTriage(makeInput({ sourceKind: 'provider_failure', score: 60 }));
117
+ expect(result.decision).toBe('health_only');
118
+ assertHasReasonAndNextAction(result);
119
+ });
120
+ });
121
+ describe('rate_limit', () => {
122
+ it('defaults to health_only', () => {
123
+ const result = evaluateTriage(makeInput({ sourceKind: 'rate_limit', score: 40 }));
124
+ expect(result.decision).toBe('health_only');
125
+ assertHasReasonAndNextAction(result);
126
+ });
127
+ });
128
+ // ── RuleHost Block ───────────────────────────────────────────────────────────
129
+ describe('rulehost_block', () => {
130
+ it('defaults to evidence_only', () => {
131
+ const result = evaluateTriage(makeInput({ sourceKind: 'rulehost_block', score: 45 }));
132
+ expect(result.decision).toBe('evidence_only');
133
+ assertHasReasonAndNextAction(result);
134
+ });
135
+ it('upgrades to admit when isUnsafeHighConfidence is true', () => {
136
+ const result = evaluateTriage(makeInput({
137
+ sourceKind: 'rulehost_block',
138
+ score: 80,
139
+ isUnsafeHighConfidence: true,
140
+ }));
141
+ expect(result.decision).toBe('admit');
142
+ expect(result.reason).toContain('unsafe');
143
+ assertHasReasonAndNextAction(result);
144
+ });
145
+ it('stays evidence_only when isUnsafeHighConfidence is false', () => {
146
+ const result = evaluateTriage(makeInput({
147
+ sourceKind: 'rulehost_block',
148
+ score: 80,
149
+ isUnsafeHighConfidence: false,
150
+ }));
151
+ expect(result.decision).toBe('evidence_only');
152
+ });
153
+ it('stays evidence_only when isUnsafeHighConfidence is undefined', () => {
154
+ const result = evaluateTriage(makeInput({
155
+ sourceKind: 'rulehost_block',
156
+ score: 80,
157
+ }));
158
+ expect(result.decision).toBe('evidence_only');
159
+ });
160
+ });
161
+ // ── Empathy Inferred ─────────────────────────────────────────────────────────
162
+ describe('empathy_inferred', () => {
163
+ it('defaults to owner_confirm — never directly creates diagnosis', () => {
164
+ const result = evaluateTriage(makeInput({ sourceKind: 'empathy_inferred', score: 80 }));
165
+ expect(result.decision).toBe('owner_confirm');
166
+ assertHasReasonAndNextAction(result);
167
+ });
168
+ it('never admits regardless of score', () => {
169
+ const high = evaluateTriage(makeInput({ sourceKind: 'empathy_inferred', score: 100 }));
170
+ expect(high.decision).toBe('owner_confirm');
171
+ const low = evaluateTriage(makeInput({ sourceKind: 'empathy_inferred', score: 10 }));
172
+ expect(low.decision).toBe('owner_confirm');
173
+ });
174
+ });
175
+ // ── Semantic ─────────────────────────────────────────────────────────────────
176
+ describe('semantic', () => {
177
+ it('defaults to evidence_only', () => {
178
+ const result = evaluateTriage(makeInput({ sourceKind: 'semantic', score: 55 }));
179
+ expect(result.decision).toBe('evidence_only');
180
+ assertHasReasonAndNextAction(result);
181
+ });
182
+ });
183
+ // ── LLM Paralysis ───────────────────────────────────────────────────────────
184
+ describe('llm_paralysis', () => {
185
+ it('defaults to evidence_only', () => {
186
+ const result = evaluateTriage(makeInput({ sourceKind: 'llm_paralysis', score: 40 }));
187
+ expect(result.decision).toBe('evidence_only');
188
+ assertHasReasonAndNextAction(result);
189
+ });
190
+ });
191
+ // ── Subagent Error ───────────────────────────────────────────────────────────
192
+ describe('subagent_error', () => {
193
+ it('defaults to evidence_only', () => {
194
+ const result = evaluateTriage(makeInput({ sourceKind: 'subagent_error', score: 60 }));
195
+ expect(result.decision).toBe('evidence_only');
196
+ assertHasReasonAndNextAction(result);
197
+ });
198
+ });
199
+ // ── GFI Threshold ───────────────────────────────────────────────────────────
200
+ describe('gfi_threshold', () => {
201
+ it('defaults to evidence_only — GFI alone cannot create diagnosis', () => {
202
+ const result = evaluateTriage(makeInput({ sourceKind: 'gfi_threshold', score: 70 }));
203
+ expect(result.decision).toBe('evidence_only');
204
+ assertHasReasonAndNextAction(result);
205
+ });
206
+ });
207
+ // ── Unknown Source ───────────────────────────────────────────────────────────
208
+ describe('unknown', () => {
209
+ it('defaults to evidence_only', () => {
210
+ const result = evaluateTriage(makeInput({ sourceKind: 'unknown', score: 50 }));
211
+ expect(result.decision).toBe('evidence_only');
212
+ assertHasReasonAndNextAction(result);
213
+ });
214
+ });
215
+ describe('invalid source kind (falls back to unknown)', () => {
216
+ it('treats invalid source kind as unknown', () => {
217
+ const fakeKind = 'not_a_kind';
218
+ const result = evaluateTriage(makeInput({ sourceKind: fakeKind, score: 50 }));
219
+ expect(result.decision).toBe('evidence_only');
220
+ expect(result.sourceKind).toBe('unknown');
221
+ assertHasReasonAndNextAction(result);
222
+ });
223
+ });
224
+ // ── Invariants ───────────────────────────────────────────────────────────────
225
+ describe('invariants', () => {
226
+ it('every result has decision, sourceKind, reason, and nextAction', () => {
227
+ const kinds = [
228
+ 'owner_reported', 'agent_on_owner_request', 'tool_failure', 'dispatch_error',
229
+ 'provider_failure', 'rate_limit', 'rulehost_block', 'empathy_inferred',
230
+ 'semantic', 'llm_paralysis', 'subagent_error', 'gfi_threshold', 'unknown',
231
+ ];
232
+ for (const kind of kinds) {
233
+ const result = evaluateTriage(makeInput({ sourceKind: kind, score: 50 }));
234
+ assertHasReasonAndNextAction(result);
235
+ expect(result.sourceKind).toBe(kind);
236
+ expect(typeof result.decision).toBe('string');
237
+ }
238
+ });
239
+ it('owner_reported always admits', () => {
240
+ for (const score of [0, 25, 50, 75, 100]) {
241
+ const result = evaluateTriage(makeInput({ sourceKind: 'owner_reported', score }));
242
+ expect(result.decision).toBe('admit');
243
+ }
244
+ });
245
+ it('empathy_inferred never admits directly', () => {
246
+ for (const score of [0, 25, 50, 75, 100]) {
247
+ const result = evaluateTriage(makeInput({ sourceKind: 'empathy_inferred', score }));
248
+ expect(result.decision).not.toBe('admit');
249
+ }
250
+ });
251
+ it('GFI never admits directly', () => {
252
+ for (const score of [0, 50, 80, 100]) {
253
+ const result = evaluateTriage(makeInput({ sourceKind: 'gfi_threshold', score }));
254
+ expect(result.decision).not.toBe('admit');
255
+ }
256
+ });
257
+ it('tool_failure never admits', () => {
258
+ for (const score of [0, 30, 60, 90, 100]) {
259
+ const result = evaluateTriage(makeInput({ sourceKind: 'tool_failure', score }));
260
+ expect(result.decision).not.toBe('admit');
261
+ }
262
+ });
263
+ });
264
+ //# sourceMappingURL=triage-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-policy.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/evidence-triage/__tests__/triage-policy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Evidence Triage — PEAT-B1
3
+ *
4
+ * Public API for pre-diagnosis evidence triage.
5
+ * Pure types and policy — no I/O, no plugin imports.
6
+ */
7
+ export type { SourceKind, TriageDecision, TriageResult, TriageInput, } from './types.js';
8
+ export { isSourceKind } from './types.js';
9
+ export type { SourceDescriptor } from './source-descriptors.js';
10
+ export { SOURCE_DESCRIPTORS, getSourceDescriptor } from './source-descriptors.js';
11
+ export { evaluateTriage } from './triage-policy.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Evidence Triage — PEAT-B1
3
+ *
4
+ * Public API for pre-diagnosis evidence triage.
5
+ * Pure types and policy — no I/O, no plugin imports.
6
+ */
7
+ export { isSourceKind } from './types.js';
8
+ export { SOURCE_DESCRIPTORS, getSourceDescriptor } from './source-descriptors.js';
9
+ // Triage policy
10
+ export { evaluateTriage } from './triage-policy.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAElF,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}