@principles/core 1.96.0 → 1.98.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 (44) 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__/pain-signal-observability.test.js +23 -1
  4. package/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  5. package/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  6. package/dist/runtime-v2/config/pd-config-defaults.js +1 -0
  7. package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  8. package/dist/runtime-v2/evidence-sanitizer.d.ts +57 -0
  9. package/dist/runtime-v2/evidence-sanitizer.d.ts.map +1 -0
  10. package/dist/runtime-v2/evidence-sanitizer.js +213 -0
  11. package/dist/runtime-v2/evidence-sanitizer.js.map +1 -0
  12. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts +13 -0
  13. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts.map +1 -0
  14. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +264 -0
  15. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -0
  16. package/dist/runtime-v2/evidence-triage/index.d.ts +12 -0
  17. package/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -0
  18. package/dist/runtime-v2/evidence-triage/index.js +11 -0
  19. package/dist/runtime-v2/evidence-triage/index.js.map +1 -0
  20. package/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +48 -0
  21. package/dist/runtime-v2/evidence-triage/source-descriptors.d.ts.map +1 -0
  22. package/dist/runtime-v2/evidence-triage/source-descriptors.js +131 -0
  23. package/dist/runtime-v2/evidence-triage/source-descriptors.js.map +1 -0
  24. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts +32 -0
  25. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -0
  26. package/dist/runtime-v2/evidence-triage/triage-policy.js +95 -0
  27. package/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -0
  28. package/dist/runtime-v2/evidence-triage/types.d.ts +65 -0
  29. package/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -0
  30. package/dist/runtime-v2/evidence-triage/types.js +38 -0
  31. package/dist/runtime-v2/evidence-triage/types.js.map +1 -0
  32. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +10 -0
  33. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  34. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  35. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +1 -0
  36. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  37. package/dist/runtime-v2/index.d.ts +3 -0
  38. package/dist/runtime-v2/index.d.ts.map +1 -1
  39. package/dist/runtime-v2/index.js +2 -0
  40. package/dist/runtime-v2/index.js.map +1 -1
  41. package/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  42. package/dist/runtime-v2/pain-signal-observability.js +24 -11
  43. package/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  44. package/package.json +1 -1
@@ -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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Source Descriptors — PEAT-B1
3
+ *
4
+ * Declarative policy mapping from SourceKind to default TriageDecision.
5
+ * This is pure data — no I/O, no plugin imports.
6
+ *
7
+ * Each descriptor defines:
8
+ * - kind: the SourceKind it describes
9
+ * - defaultDecision: the default triage decision
10
+ * - reason: why this default was chosen
11
+ * - nextAction: what should happen when this decision is applied
12
+ * - canUpgrade: whether the plugin adapter may upgrade the decision
13
+ * (e.g., rulehost_block can be upgraded to 'admit' for unsafe actions)
14
+ *
15
+ * ERR checklist:
16
+ * - ERR-002: Every descriptor carries reason + nextAction.
17
+ * - ERR-005: Descriptors are data, not assumptions about callers.
18
+ */
19
+ import type { SourceKind, TriageDecision } from './types.js';
20
+ export interface SourceDescriptor {
21
+ readonly kind: SourceKind;
22
+ readonly defaultDecision: TriageDecision;
23
+ readonly reason: string;
24
+ readonly nextAction: string;
25
+ /**
26
+ * Whether the plugin adapter may upgrade this decision.
27
+ * When true, the adapter can override defaultDecision based on context
28
+ * (e.g., isUnsafeHighConfidence for rulehost_block).
29
+ */
30
+ readonly canUpgrade: boolean;
31
+ }
32
+ /**
33
+ * Source kind descriptors. Order does not matter — lookup is by kind.
34
+ *
35
+ * Design rationale per PRODUCT_IDENTITY.md and ADR-0014:
36
+ * - PD owns owner-relevant behavior evidence, not tool repair.
37
+ * - Manual/owner-reported pain has highest confidence.
38
+ * - Tool failures are infrastructure noise (OpenClaw's job, not PD's).
39
+ * - Empathy-inferred frustration must never silently create diagnosis.
40
+ * - GFI alone cannot trigger diagnosis (it's a session health metric).
41
+ */
42
+ export declare const SOURCE_DESCRIPTORS: ReadonlyMap<SourceKind, SourceDescriptor>;
43
+ /**
44
+ * Get the source descriptor for a given kind.
45
+ * Returns undefined if the kind is not registered (caller should treat as 'unknown').
46
+ */
47
+ export declare function getSourceDescriptor(kind: SourceKind): SourceDescriptor | undefined;
48
+ //# sourceMappingURL=source-descriptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-descriptors.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/source-descriptors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI7D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAID;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,UAAU,EAAE,gBAAgB,CA4FvE,CAAC;AAIH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAElF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Source Descriptors — PEAT-B1
3
+ *
4
+ * Declarative policy mapping from SourceKind to default TriageDecision.
5
+ * This is pure data — no I/O, no plugin imports.
6
+ *
7
+ * Each descriptor defines:
8
+ * - kind: the SourceKind it describes
9
+ * - defaultDecision: the default triage decision
10
+ * - reason: why this default was chosen
11
+ * - nextAction: what should happen when this decision is applied
12
+ * - canUpgrade: whether the plugin adapter may upgrade the decision
13
+ * (e.g., rulehost_block can be upgraded to 'admit' for unsafe actions)
14
+ *
15
+ * ERR checklist:
16
+ * - ERR-002: Every descriptor carries reason + nextAction.
17
+ * - ERR-005: Descriptors are data, not assumptions about callers.
18
+ */
19
+ // ── Descriptor Registry ─────────────────────────────────────────────────────
20
+ /**
21
+ * Source kind descriptors. Order does not matter — lookup is by kind.
22
+ *
23
+ * Design rationale per PRODUCT_IDENTITY.md and ADR-0014:
24
+ * - PD owns owner-relevant behavior evidence, not tool repair.
25
+ * - Manual/owner-reported pain has highest confidence.
26
+ * - Tool failures are infrastructure noise (OpenClaw's job, not PD's).
27
+ * - Empathy-inferred frustration must never silently create diagnosis.
28
+ * - GFI alone cannot trigger diagnosis (it's a session health metric).
29
+ */
30
+ export const SOURCE_DESCRIPTORS = new Map([
31
+ ['owner_reported', {
32
+ kind: 'owner_reported',
33
+ defaultDecision: 'admit',
34
+ reason: 'Owner explicitly reported pain. Highest confidence signal.',
35
+ nextAction: 'none',
36
+ canUpgrade: false,
37
+ }],
38
+ ['agent_on_owner_request', {
39
+ kind: 'agent_on_owner_request',
40
+ defaultDecision: 'admit',
41
+ reason: 'Agent recorded pain at owner request. Owner intent preserved.',
42
+ nextAction: 'none',
43
+ canUpgrade: false,
44
+ }],
45
+ ['tool_failure', {
46
+ kind: 'tool_failure',
47
+ defaultDecision: 'evidence_only',
48
+ reason: 'Tool failure is infrastructure noise. PD does not own tool repair (ADR-0014).',
49
+ nextAction: 'store_as_evidence_for_later_correlation',
50
+ canUpgrade: false,
51
+ }],
52
+ ['dispatch_error', {
53
+ kind: 'dispatch_error',
54
+ defaultDecision: 'evidence_only',
55
+ reason: 'Dispatch/subagent routing error. Not a behavior pattern.',
56
+ nextAction: 'store_as_evidence_for_later_correlation',
57
+ canUpgrade: false,
58
+ }],
59
+ ['provider_failure', {
60
+ kind: 'provider_failure',
61
+ defaultDecision: 'health_only',
62
+ reason: 'LLM provider failure. Infrastructure health signal, not owner-relevant behavior.',
63
+ nextAction: 'record_in_health_telemetry',
64
+ canUpgrade: false,
65
+ }],
66
+ ['rate_limit', {
67
+ kind: 'rate_limit',
68
+ defaultDecision: 'health_only',
69
+ reason: 'LLM provider rate limit. Infrastructure health signal, not owner-relevant behavior.',
70
+ nextAction: 'record_in_health_telemetry',
71
+ canUpgrade: false,
72
+ }],
73
+ ['rulehost_block', {
74
+ kind: 'rulehost_block',
75
+ defaultDecision: 'evidence_only',
76
+ reason: 'RuleHost block is near-miss evidence. Default evidence-only.',
77
+ nextAction: 'store_as_evidence_for_later_correlation',
78
+ canUpgrade: true, // adapter can upgrade to 'admit' for high-confidence unsafe actions
79
+ }],
80
+ ['empathy_inferred', {
81
+ kind: 'empathy_inferred',
82
+ defaultDecision: 'owner_confirm',
83
+ reason: 'Empathy-inferred frustration. Never silently creates diagnosis (PRODUCT_IDENTITY: owner-governed).',
84
+ nextAction: 'request_owner_confirmation_before_diagnosis',
85
+ canUpgrade: false,
86
+ }],
87
+ ['semantic', {
88
+ kind: 'semantic',
89
+ defaultDecision: 'evidence_only',
90
+ reason: 'Keyword/detection match. Not explicit owner pain. Needs accumulation.',
91
+ nextAction: 'store_as_evidence_for_later_correlation',
92
+ canUpgrade: false,
93
+ }],
94
+ ['llm_paralysis', {
95
+ kind: 'llm_paralysis',
96
+ defaultDecision: 'evidence_only',
97
+ reason: 'Session health signal. GFI alone cannot create diagnosis.',
98
+ nextAction: 'store_as_evidence_for_later_correlation',
99
+ canUpgrade: false,
100
+ }],
101
+ ['subagent_error', {
102
+ kind: 'subagent_error',
103
+ defaultDecision: 'evidence_only',
104
+ reason: 'Subagent workflow failure. Not a behavior pattern by itself.',
105
+ nextAction: 'store_as_evidence_for_later_correlation',
106
+ canUpgrade: false,
107
+ }],
108
+ ['gfi_threshold', {
109
+ kind: 'gfi_threshold',
110
+ defaultDecision: 'evidence_only',
111
+ reason: 'Accumulated GFI. GFI alone cannot create diagnosis per acceptance criteria.',
112
+ nextAction: 'store_as_evidence_for_later_correlation',
113
+ canUpgrade: false,
114
+ }],
115
+ ['unknown', {
116
+ kind: 'unknown',
117
+ defaultDecision: 'evidence_only',
118
+ reason: 'Unclassified source. Conservative default.',
119
+ nextAction: 'classify_source_kind_and_store_as_evidence',
120
+ canUpgrade: false,
121
+ }],
122
+ ]);
123
+ // ── Lookup ───────────────────────────────────────────────────────────────────
124
+ /**
125
+ * Get the source descriptor for a given kind.
126
+ * Returns undefined if the kind is not registered (caller should treat as 'unknown').
127
+ */
128
+ export function getSourceDescriptor(kind) {
129
+ return SOURCE_DESCRIPTORS.get(kind);
130
+ }
131
+ //# sourceMappingURL=source-descriptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-descriptors.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/source-descriptors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Triage Policy — PEAT-B1
3
+ *
4
+ * Pure policy evaluation for pre-diagnosis evidence triage.
5
+ * No I/O, no plugin imports, no side effects.
6
+ *
7
+ * This module evaluates a TriageInput against source descriptors
8
+ * and returns a TriageResult. The plugin adapter calls this function
9
+ * and uses the result to decide whether to proceed to diagnosis.
10
+ *
11
+ * ERR checklist:
12
+ * - ERR-001: No `as` casts. Input validated with runtime guards.
13
+ * - ERR-002: Every result carries structured reason + nextAction.
14
+ * - ERR-005: Input is unknown, validated field-by-field.
15
+ */
16
+ import type { TriageInput, TriageResult } from './types.js';
17
+ /**
18
+ * Evaluate triage policy for incoming evidence.
19
+ *
20
+ * This is the pure policy function. It does not:
21
+ * - Call PainDiagnosticGate
22
+ * - Write to event log or trajectory
23
+ * - Create diagnostic tasks
24
+ * - Import anything from the plugin layer
25
+ *
26
+ * It only reads source descriptors and applies policy rules.
27
+ *
28
+ * @param input - Triage input with source kind and context
29
+ * @returns Structured triage result with decision, reason, and nextAction
30
+ */
31
+ export declare function evaluateTriage(input: TriageInput): TriageResult;
32
+ //# sourceMappingURL=triage-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-policy.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/triage-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA8B,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuCxF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAmC/D"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Triage Policy — PEAT-B1
3
+ *
4
+ * Pure policy evaluation for pre-diagnosis evidence triage.
5
+ * No I/O, no plugin imports, no side effects.
6
+ *
7
+ * This module evaluates a TriageInput against source descriptors
8
+ * and returns a TriageResult. The plugin adapter calls this function
9
+ * and uses the result to decide whether to proceed to diagnosis.
10
+ *
11
+ * ERR checklist:
12
+ * - ERR-001: No `as` casts. Input validated with runtime guards.
13
+ * - ERR-002: Every result carries structured reason + nextAction.
14
+ * - ERR-005: Input is unknown, validated field-by-field.
15
+ */
16
+ import { isSourceKind } from './types.js';
17
+ import { getSourceDescriptor } from './source-descriptors.js';
18
+ // ── Upgrade Rules ───────────────────────────────────────────────────────────
19
+ /**
20
+ * Apply upgrade rules for upgradable source kinds.
21
+ *
22
+ * Currently only 'rulehost_block' can be upgraded:
23
+ * - If isUnsafeHighConfidence is true, upgrade from 'evidence_only' to 'admit'
24
+ *
25
+ * This is the ONLY place where context-dependent upgrades happen in core.
26
+ * The plugin adapter sets isUnsafeHighConfidence based on hook context.
27
+ */
28
+ function applyUpgradeRules(input, defaultDecision) {
29
+ if (input.sourceKind === 'rulehost_block' && input.isUnsafeHighConfidence === true) {
30
+ return 'admit';
31
+ }
32
+ return defaultDecision;
33
+ }
34
+ function getUpgradeReason(sourceKind, decision, input) {
35
+ if (sourceKind === 'rulehost_block' && decision === 'admit') {
36
+ return `RuleHost blocked a high-confidence unsafe action (score=${input.score}). Upgrading to direct diagnosis.`;
37
+ }
38
+ // Should not reach here — fallback
39
+ return `Upgraded decision for ${sourceKind}: ${decision}`;
40
+ }
41
+ function getUpgradeNextAction(sourceKind, decision) {
42
+ if (sourceKind === 'rulehost_block' && decision === 'admit') {
43
+ return 'none';
44
+ }
45
+ return 'none';
46
+ }
47
+ // ── Evaluation ──────────────────────────────────────────────────────────────
48
+ /**
49
+ * Evaluate triage policy for incoming evidence.
50
+ *
51
+ * This is the pure policy function. It does not:
52
+ * - Call PainDiagnosticGate
53
+ * - Write to event log or trajectory
54
+ * - Create diagnostic tasks
55
+ * - Import anything from the plugin layer
56
+ *
57
+ * It only reads source descriptors and applies policy rules.
58
+ *
59
+ * @param input - Triage input with source kind and context
60
+ * @returns Structured triage result with decision, reason, and nextAction
61
+ */
62
+ export function evaluateTriage(input) {
63
+ // ERR-001: validate sourceKind with runtime guard
64
+ const sourceKind = isSourceKind(input.sourceKind) ? input.sourceKind : 'unknown';
65
+ // Look up descriptor
66
+ const descriptor = getSourceDescriptor(sourceKind);
67
+ if (!descriptor) {
68
+ // Fallback for unregistered kinds (should not happen with 'unknown' in registry)
69
+ return {
70
+ decision: 'evidence_only',
71
+ sourceKind: 'unknown',
72
+ reason: `Source kind '${sourceKind}' not found in descriptor registry. Conservative default.`,
73
+ nextAction: 'classify_source_kind_and_store_as_evidence',
74
+ };
75
+ }
76
+ // Apply upgrade rules for upgradable kinds
77
+ if (descriptor.canUpgrade) {
78
+ const upgraded = applyUpgradeRules(input, descriptor.defaultDecision);
79
+ if (upgraded !== descriptor.defaultDecision) {
80
+ return {
81
+ decision: upgraded,
82
+ sourceKind,
83
+ reason: getUpgradeReason(sourceKind, upgraded, input),
84
+ nextAction: getUpgradeNextAction(sourceKind, upgraded),
85
+ };
86
+ }
87
+ }
88
+ return {
89
+ decision: descriptor.defaultDecision,
90
+ sourceKind,
91
+ reason: descriptor.reason,
92
+ nextAction: descriptor.nextAction,
93
+ };
94
+ }
95
+ //# sourceMappingURL=triage-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-policy.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/triage-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,KAAkB,EAAE,eAA+B;IAC5E,IAAI,KAAK,CAAC,UAAU,KAAK,gBAAgB,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;QACnF,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAsB,EAAE,QAAwB,EAAE,KAAkB;IAC5F,IAAI,UAAU,KAAK,gBAAgB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,2DAA2D,KAAK,CAAC,KAAK,mCAAmC,CAAC;IACnH,CAAC;IACD,mCAAmC;IACnC,OAAO,yBAAyB,UAAU,KAAK,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAsB,EAAE,QAAwB;IAC5E,IAAI,UAAU,KAAK,gBAAgB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,kDAAkD;IAClD,MAAM,UAAU,GAAe,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,qBAAqB;IACrB,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,iFAAiF;QACjF,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,gBAAgB,UAAU,2DAA2D;YAC7F,UAAU,EAAE,4CAA4C;SACzD,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,QAAQ,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;YAC5C,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,UAAU;gBACV,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC;gBACrD,UAAU,EAAE,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC;aACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,eAAe;QACpC,UAAU;QACV,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,UAAU,EAAE,UAAU,CAAC,UAAU;KAClC,CAAC;AACJ,CAAC"}