create-principles-disciple 1.124.2 → 1.125.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 (89) hide show
  1. package/core/dist/index.d.ts +3 -3
  2. package/core/dist/index.js +3 -3
  3. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +93 -0
  4. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  5. package/core/dist/runtime-v2/index.d.ts +2 -0
  6. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  7. package/core/dist/runtime-v2/index.js.map +1 -1
  8. package/core/dist/runtime-v2/pain-signal-bridge.d.ts +8 -1
  9. package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  10. package/core/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  11. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  12. package/core/dist/runtime-v2/pain-signal-observability.js +25 -10
  13. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  14. package/core/package.json +0 -1
  15. package/host-runtime/dist/governance-signal-admission.js +11 -5
  16. package/host-runtime/dist/index.d.ts +3 -0
  17. package/host-runtime/dist/index.js +1 -0
  18. package/host-runtime/dist/production-pain-evidence.d.ts +7 -0
  19. package/host-runtime/dist/production-pain-evidence.js +9 -4
  20. package/package.json +1 -1
  21. package/pd-cli/dist/commands/pain-list.d.ts +45 -0
  22. package/pd-cli/dist/commands/pain-list.d.ts.map +1 -0
  23. package/pd-cli/dist/commands/pain-list.js +165 -0
  24. package/pd-cli/dist/commands/pain-list.js.map +1 -0
  25. package/pd-cli/dist/index.js +11 -0
  26. package/pd-cli/dist/index.js.map +1 -1
  27. package/plugin/dist/bundle.js +27 -23
  28. package/plugin/dist/core/trajectory-types.d.ts +2 -0
  29. package/plugin/dist/rulehost-evidence.js +9 -7
  30. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts +0 -2
  31. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts.map +0 -1
  32. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.js +0 -346
  33. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.js.map +0 -1
  34. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts +0 -2
  35. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts.map +0 -1
  36. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.js +0 -290
  37. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.js.map +0 -1
  38. package/core/dist/adapters/__tests__/writing-pain-adapter.test.d.ts +0 -2
  39. package/core/dist/adapters/__tests__/writing-pain-adapter.test.d.ts.map +0 -1
  40. package/core/dist/adapters/__tests__/writing-pain-adapter.test.js +0 -239
  41. package/core/dist/adapters/__tests__/writing-pain-adapter.test.js.map +0 -1
  42. package/core/dist/adapters/code-review/code-review-pain-adapter.d.ts +0 -13
  43. package/core/dist/adapters/code-review/code-review-pain-adapter.d.ts.map +0 -1
  44. package/core/dist/adapters/code-review/code-review-pain-adapter.js +0 -139
  45. package/core/dist/adapters/code-review/code-review-pain-adapter.js.map +0 -1
  46. package/core/dist/adapters/code-review/index.d.ts +0 -6
  47. package/core/dist/adapters/code-review/index.d.ts.map +0 -1
  48. package/core/dist/adapters/code-review/index.js +0 -2
  49. package/core/dist/adapters/code-review/index.js.map +0 -1
  50. package/core/dist/adapters/code-review/review-event-types.d.ts +0 -54
  51. package/core/dist/adapters/code-review/review-event-types.d.ts.map +0 -1
  52. package/core/dist/adapters/code-review/review-event-types.js +0 -8
  53. package/core/dist/adapters/code-review/review-event-types.js.map +0 -1
  54. package/core/dist/adapters/coding/index.d.ts +0 -6
  55. package/core/dist/adapters/coding/index.d.ts.map +0 -1
  56. package/core/dist/adapters/coding/index.js +0 -5
  57. package/core/dist/adapters/coding/index.js.map +0 -1
  58. package/core/dist/adapters/coding/openclaw-event-types.d.ts +0 -26
  59. package/core/dist/adapters/coding/openclaw-event-types.d.ts.map +0 -1
  60. package/core/dist/adapters/coding/openclaw-event-types.js +0 -9
  61. package/core/dist/adapters/coding/openclaw-event-types.js.map +0 -1
  62. package/core/dist/adapters/coding/openclaw-pain-adapter.d.ts +0 -27
  63. package/core/dist/adapters/coding/openclaw-pain-adapter.d.ts.map +0 -1
  64. package/core/dist/adapters/coding/openclaw-pain-adapter.js +0 -102
  65. package/core/dist/adapters/coding/openclaw-pain-adapter.js.map +0 -1
  66. package/core/dist/adapters/writing/index.d.ts +0 -6
  67. package/core/dist/adapters/writing/index.d.ts.map +0 -1
  68. package/core/dist/adapters/writing/index.js +0 -5
  69. package/core/dist/adapters/writing/index.js.map +0 -1
  70. package/core/dist/adapters/writing/writing-pain-adapter.d.ts +0 -22
  71. package/core/dist/adapters/writing/writing-pain-adapter.d.ts.map +0 -1
  72. package/core/dist/adapters/writing/writing-pain-adapter.js +0 -62
  73. package/core/dist/adapters/writing/writing-pain-adapter.js.map +0 -1
  74. package/core/dist/adapters/writing/writing-types.d.ts +0 -34
  75. package/core/dist/adapters/writing/writing-types.d.ts.map +0 -1
  76. package/core/dist/adapters/writing/writing-types.js +0 -9
  77. package/core/dist/adapters/writing/writing-types.js.map +0 -1
  78. package/core/dist/pain-signal-adapter.d.ts +0 -37
  79. package/core/dist/pain-signal-adapter.d.ts.map +0 -1
  80. package/core/dist/pain-signal-adapter.js +0 -2
  81. package/core/dist/pain-signal-adapter.js.map +0 -1
  82. package/core/dist/pain-signal.d.ts +0 -16
  83. package/core/dist/pain-signal.d.ts.map +0 -1
  84. package/core/dist/pain-signal.js +0 -15
  85. package/core/dist/pain-signal.js.map +0 -1
  86. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +0 -2
  87. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +0 -1
  88. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js +0 -150
  89. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +0 -1
@@ -69,6 +69,8 @@ export interface TrajectoryPainEventInput {
69
69
  canonicalPainId?: string;
70
70
  /** PRI-406: Runtime V2 diagnostician task ID linked to this pain event. */
71
71
  runtimeTaskId?: string;
72
+ /** PRI-640: Host attribution ('openclaw' | 'codex'); omit for manual/legacy (persists NULL = unknown). */
73
+ hostKind?: 'openclaw' | 'codex';
72
74
  }
73
75
  export interface TrajectoryGateBlockInput {
74
76
  sessionId?: string | null;
@@ -416,6 +416,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
416
416
  text TEXT,
417
417
  canonical_pain_id TEXT,
418
418
  runtime_task_id TEXT,
419
+ host_kind TEXT,
419
420
  created_at TEXT NOT NULL
420
421
  );
421
422
  CREATE TABLE IF NOT EXISTS gate_blocks (
@@ -513,7 +514,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
513
514
  metadata_json TEXT,
514
515
  created_at TEXT NOT NULL
515
516
  );
516
- `);try{e.exec("ALTER TABLE pain_events ADD COLUMN text TEXT")}catch(o){let a=o instanceof Error?o.message:String(o);if(!a.includes("duplicate column name")&&!a.includes("no column named"))throw o}for(let o of[{name:"canonical_pain_id",type:"TEXT"},{name:"runtime_task_id",type:"TEXT"}])try{e.exec(`ALTER TABLE pain_events ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}let r=[{table:"assistant_turns",name:"stop_reason",type:"TEXT"},{table:"assistant_turns",name:"thinking_blocks_count",type:"INTEGER"},{table:"tool_calls",name:"result_preview",type:"TEXT"}];for(let o of r)try{e.exec(`ALTER TABLE ${o.table} ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}e.exec(`
517
+ `);try{e.exec("ALTER TABLE pain_events ADD COLUMN text TEXT")}catch(o){let a=o instanceof Error?o.message:String(o);if(!a.includes("duplicate column name")&&!a.includes("no column named"))throw o}for(let o of[{name:"canonical_pain_id",type:"TEXT"},{name:"runtime_task_id",type:"TEXT"},{name:"host_kind",type:"TEXT"}])try{e.exec(`ALTER TABLE pain_events ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}let r=[{table:"assistant_turns",name:"stop_reason",type:"TEXT"},{table:"assistant_turns",name:"thinking_blocks_count",type:"INTEGER"},{table:"tool_calls",name:"result_preview",type:"TEXT"}];for(let o of r)try{e.exec(`ALTER TABLE ${o.table} ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}e.exec(`
517
518
  CREATE UNIQUE INDEX IF NOT EXISTS idx_pain_events_canonical_pain_id
518
519
  ON pain_events(canonical_pain_id)
519
520
  WHERE canonical_pain_id IS NOT NULL
@@ -568,13 +569,14 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
568
569
  `).run(t.sessionId,t.toolName,t.outcome,t.durationMs??null,t.exitCode??null,t.errorType??null,t.errorMessage??null,t.gfiBefore??null,t.gfiAfter??null,Kh(t.paramsJson),t.resultPreview??null,n);return Number(i.lastInsertRowid)});return t.outcome==="success"&&this.maybeCreateCorrectionSample(t.sessionId),r}recordPainEvent(t){this.recordSession({sessionId:t.sessionId,startedAt:t.createdAt});let n=-1;return this.withWrite(()=>{try{let r=this.db.prepare(`
569
570
  INSERT INTO pain_events (
570
571
  session_id, source, score, reason, severity, origin, confidence, text, created_at,
571
- canonical_pain_id, runtime_task_id
572
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
573
- `).run(t.sessionId,t.source,t.score,t.reason??null,t.severity??null,t.origin??null,t.confidence??null,t.text??null,t.createdAt??Di(),t.canonicalPainId??null,t.runtimeTaskId??null);n=Number(r.lastInsertRowid)}catch(r){if(t.canonicalPainId&&r instanceof Error&&r.message.includes("UNIQUE constraint failed")&&r.message.includes("canonical_pain_id")){this.db.prepare(`
572
+ canonical_pain_id, runtime_task_id, host_kind
573
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
574
+ `).run(t.sessionId,t.source,t.score,t.reason??null,t.severity??null,t.origin??null,t.confidence??null,t.text??null,t.createdAt??Di(),t.canonicalPainId??null,t.runtimeTaskId??null,t.hostKind??null);n=Number(r.lastInsertRowid)}catch(r){if(t.canonicalPainId&&r instanceof Error&&r.message.includes("UNIQUE constraint failed")&&r.message.includes("canonical_pain_id")){this.db.prepare(`
574
575
  UPDATE pain_events
575
- SET runtime_task_id = COALESCE(?, runtime_task_id)
576
+ SET runtime_task_id = COALESCE(?, runtime_task_id),
577
+ host_kind = COALESCE(host_kind, ?)
576
578
  WHERE canonical_pain_id = ?
577
- `).run(t.runtimeTaskId??null,t.canonicalPainId);let i=this.db.prepare("SELECT id FROM pain_events WHERE canonical_pain_id = ?").get(t.canonicalPainId);i&&typeof i=="object"&&Object.hasOwn(i,"id")&&typeof i.id=="number"?n=i.id:n=-1}else throw r}}),n}recordGateBlock(t){this.withWrite(()=>{this.db.prepare(`
579
+ `).run(t.runtimeTaskId??null,t.hostKind??null,t.canonicalPainId);let i=this.db.prepare("SELECT id FROM pain_events WHERE canonical_pain_id = ?").get(t.canonicalPainId);i&&typeof i=="object"&&Object.hasOwn(i,"id")&&typeof i.id=="number"?n=i.id:n=-1}else throw r}}),n}recordGateBlock(t){this.withWrite(()=>{this.db.prepare(`
578
580
  INSERT INTO gate_blocks (session_id, tool_name, file_path, reason, created_at)
579
581
  VALUES (?, ?, ?, ?, ?)
580
582
  `).run(t.sessionId??null,t.toolName,t.filePath??null,t.reason,t.createdAt??Di())})}recordTrustChange(t){this.withWrite(()=>{this.db.prepare(`
@@ -714,7 +716,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
714
716
  review_status, export_mode, created_at, updated_at
715
717
  FROM correction_samples
716
718
  WHERE sample_id = ?
717
- `).get(t);if(!a)throw new lI(`${t} (after update)`);return n==="rejected"&&this.recordCorrectionRejectedPain({session_id:a.session_id,quality_score:a.quality_score,diff_excerpt:a.diff_excerpt,principle_ids_json:a.principle_ids_json,created_at:a.created_at}),{sampleId:String(a.sample_id),sessionId:String(a.session_id),badAssistantTurnId:Number(a.bad_assistant_turn_id),userCorrectionTurnId:Number(a.user_correction_turn_id),recoveryToolSpanJson:String(a.recovery_tool_span_json),diffExcerpt:String(a.diff_excerpt??""),principleIdsJson:String(a.principle_ids_json??"[]"),qualityScore:Number(a.quality_score),reviewStatus:a.review_status,exportMode:a.export_mode,createdAt:String(a.created_at),updatedAt:String(a.updated_at)}}recordCorrectionRejectedPain(t){let n=String(t.session_id),r=Number(t.quality_score),i=String(t.diff_excerpt??""),o=String(t.principle_ids_json??"[]"),a=Math.max(0,Math.min(100,Math.round(Number(r)||0))),c=`Correction rejected (quality ${r.toFixed(2)}). Principles: ${o}${i?` \u2014 ${i.slice(0,120)}`:""}`;try{this.recordPainEvent({sessionId:n,source:"correction_rejected",score:a,reason:c,severity:a>=70?"severe":a>=40?"moderate":"mild",origin:"system_infer",text:i||void 0,createdAt:String(t.created_at)})}catch(u){console.warn(`[Trajectory] Failed to record correction_rejected pain event: ${String(u)}`)}}exportCorrections(t){let n=this.db.prepare(`
719
+ `).get(t);if(!a)throw new lI(`${t} (after update)`);return n==="rejected"&&this.recordCorrectionRejectedPain({session_id:a.session_id,quality_score:a.quality_score,diff_excerpt:a.diff_excerpt,principle_ids_json:a.principle_ids_json,created_at:a.created_at}),{sampleId:String(a.sample_id),sessionId:String(a.session_id),badAssistantTurnId:Number(a.bad_assistant_turn_id),userCorrectionTurnId:Number(a.user_correction_turn_id),recoveryToolSpanJson:String(a.recovery_tool_span_json),diffExcerpt:String(a.diff_excerpt??""),principleIdsJson:String(a.principle_ids_json??"[]"),qualityScore:Number(a.quality_score),reviewStatus:a.review_status,exportMode:a.export_mode,createdAt:String(a.created_at),updatedAt:String(a.updated_at)}}recordCorrectionRejectedPain(t){let n=String(t.session_id),r=Number(t.quality_score),i=String(t.diff_excerpt??""),o=String(t.principle_ids_json??"[]"),a=Math.max(0,Math.min(100,Math.round(Number(r)||0))),c=`Correction rejected (quality ${r.toFixed(2)}). Principles: ${o}${i?` \u2014 ${i.slice(0,120)}`:""}`;try{this.recordPainEvent({sessionId:n,source:"correction_rejected",score:a,reason:c,severity:a>=70?"severe":a>=40?"moderate":"mild",origin:"system_infer",text:i||void 0,createdAt:String(t.created_at),hostKind:"openclaw"})}catch(u){console.warn(`[Trajectory] Failed to record correction_rejected pain event: ${String(u)}`)}}exportCorrections(t){let n=this.db.prepare(`
718
720
  SELECT cs.sample_id, cs.session_id, cs.recovery_tool_span_json, cs.diff_excerpt, cs.quality_score,
719
721
  at.raw_text AS assistant_raw_text, at.blob_ref AS assistant_blob_ref, at.sanitized_text,
720
722
  ut.raw_text AS user_raw_text, ut.blob_ref AS user_blob_ref, ut.correction_cue
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=code-review-pain-adapter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-review-pain-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-review-pain-adapter.test.ts"],"names":[],"mappings":""}
@@ -1,346 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CodeReviewPainAdapter } from '../code-review/code-review-pain-adapter.js';
3
- describe('CodeReviewPainAdapter', () => {
4
- const adapter = new CodeReviewPainAdapter();
5
- const baseFile = {
6
- path: 'src/index.ts',
7
- linesAdded: 10,
8
- linesDeleted: 5,
9
- changeMagnitude: 15,
10
- };
11
- const baseEvent = {
12
- prId: 'pr-1',
13
- repositoryId: 'repo-1',
14
- authorId: 'author-1',
15
- reviewerIds: ['reviewer-1'],
16
- filesChanged: [baseFile],
17
- totalLinesAdded: 10,
18
- totalLinesDeleted: 5,
19
- comments: [],
20
- unresolvedThreadCount: 0,
21
- createdAt: '2026-01-01T00:00:00Z',
22
- reviewAgeDays: 1,
23
- hasTests: true,
24
- hasSecurityReview: true,
25
- isBreakingChange: false,
26
- labels: [],
27
- sessionId: 'sess-123',
28
- };
29
- // ---------------------------------------------------------------------------
30
- // Null-return paths
31
- // ---------------------------------------------------------------------------
32
- it('returns null for missing sessionId', () => {
33
- const event = { ...baseEvent, sessionId: '' };
34
- expect(adapter.capture(event)).toBeNull();
35
- });
36
- it('returns null when sessionId is not a string', () => {
37
- const event = { ...baseEvent, sessionId: 42 };
38
- expect(adapter.capture(event)).toBeNull();
39
- });
40
- it('returns null when no files changed and no comments', () => {
41
- const event = { ...baseEvent, filesChanged: [], comments: [] };
42
- expect(adapter.capture(event)).toBeNull();
43
- });
44
- it('returns null when filesChanged is undefined and no comments', () => {
45
- const { filesChanged: _filesChanged, ...eventWithoutFiles } = baseEvent;
46
- const event = { ...eventWithoutFiles, filesChanged: undefined, comments: [] };
47
- expect(adapter.capture(event)).toBeNull();
48
- });
49
- it('returns null for negative reviewAgeDays', () => {
50
- const event = { ...baseEvent, reviewAgeDays: -1 };
51
- expect(adapter.capture(event)).toBeNull();
52
- });
53
- // ---------------------------------------------------------------------------
54
- // Valid event with process violation
55
- // ---------------------------------------------------------------------------
56
- it('produces high score for process violation (no tests, >2 files, breaking change)', () => {
57
- const event = {
58
- ...baseEvent,
59
- filesChanged: [
60
- { path: 'src/a.ts', linesAdded: 50, linesDeleted: 10, changeMagnitude: 60 },
61
- { path: 'src/b.ts', linesAdded: 30, linesDeleted: 5, changeMagnitude: 35 },
62
- { path: 'src/c.ts', linesAdded: 20, linesDeleted: 5, changeMagnitude: 25 },
63
- ],
64
- totalLinesAdded: 100,
65
- totalLinesDeleted: 20,
66
- hasTests: false,
67
- isBreakingChange: true,
68
- labels: [],
69
- hasSecurityReview: false,
70
- };
71
- const signal = adapter.capture(event);
72
- expect(signal).not.toBeNull();
73
- if (!signal)
74
- throw new Error('Expected non-null signal');
75
- // No tests + >2 files = +35, breaking change without label = +40 → process >= 40
76
- expect(signal.source).toBe('process_violation');
77
- expect(signal.score).toBeGreaterThan(0);
78
- // Severity should be at least medium for process violations
79
- expect(['medium', 'high', 'critical']).toContain(signal.severity);
80
- });
81
- // ---------------------------------------------------------------------------
82
- // Valid event with negative sentiment
83
- // ---------------------------------------------------------------------------
84
- it('produces negative_sentiment trigger when comments are negative', () => {
85
- const negativeComment = {
86
- id: 'c2',
87
- authorId: 'reviewer-1',
88
- body: 'This code is terrible and should be rewritten',
89
- sentimentScore: -80,
90
- createdAt: '2026-01-01T00:00:00Z',
91
- // unresolved: no resolvedAt
92
- };
93
- const event = {
94
- ...baseEvent,
95
- comments: [negativeComment],
96
- unresolvedThreadCount: 1,
97
- hasTests: true,
98
- isBreakingChange: false,
99
- };
100
- const signal = adapter.capture(event);
101
- expect(signal).not.toBeNull();
102
- if (!signal)
103
- throw new Error('Expected non-null signal');
104
- // With negative sentiment comments, source should be negative_sentiment
105
- // provided process violation score < 40
106
- expect(signal.source).toBe('negative_sentiment');
107
- });
108
- // ---------------------------------------------------------------------------
109
- // Valid event with diff complexity
110
- // ---------------------------------------------------------------------------
111
- it('produces diff_complexity trigger for many files with no process violations or negative sentiment', () => {
112
- const manyFiles = Array.from({ length: 10 }, (_, i) => ({
113
- path: `src/file${i}.ts`,
114
- linesAdded: 100,
115
- linesDeleted: 50,
116
- changeMagnitude: 150,
117
- }));
118
- // Use positive-sentiment comments so sentiment score stays below 40 threshold
119
- const positiveComment = {
120
- id: 'c-pos',
121
- authorId: 'reviewer-1',
122
- body: 'Looks great!',
123
- sentimentScore: 80,
124
- createdAt: '2026-01-01T00:00:00Z',
125
- resolvedAt: '2026-01-02T00:00:00Z',
126
- };
127
- const event = {
128
- ...baseEvent,
129
- filesChanged: manyFiles,
130
- totalLinesAdded: 1000,
131
- totalLinesDeleted: 500,
132
- hasTests: true,
133
- isBreakingChange: false,
134
- hasSecurityReview: true,
135
- comments: [positiveComment],
136
- };
137
- const signal = adapter.capture(event);
138
- expect(signal).not.toBeNull();
139
- if (!signal)
140
- throw new Error('Expected non-null signal');
141
- expect(signal.source).toBe('diff_complexity');
142
- });
143
- // ---------------------------------------------------------------------------
144
- // Score clamping
145
- // ---------------------------------------------------------------------------
146
- it('clamps score to 0-100 range', () => {
147
- // Extreme process violations could theoretically push score > 100
148
- const event = {
149
- ...baseEvent,
150
- filesChanged: [
151
- { path: 'security/auth.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
152
- { path: 'security/crypto.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
153
- { path: 'src/main.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
154
- ],
155
- totalLinesAdded: 900,
156
- totalLinesDeleted: 600,
157
- hasTests: false,
158
- isBreakingChange: true,
159
- labels: [],
160
- hasSecurityReview: false,
161
- };
162
- const signal = adapter.capture(event);
163
- expect(signal).not.toBeNull();
164
- if (!signal)
165
- throw new Error('Expected non-null signal');
166
- expect(signal.score).toBeGreaterThanOrEqual(0);
167
- expect(signal.score).toBeLessThanOrEqual(100);
168
- });
169
- // ---------------------------------------------------------------------------
170
- // triggerTextPreview truncation
171
- // ---------------------------------------------------------------------------
172
- it('truncates triggerTextPreview to 200 chars', () => {
173
- const longBody = 'x'.repeat(300);
174
- const negativeComment = {
175
- id: 'c3',
176
- authorId: 'reviewer-1',
177
- body: longBody,
178
- sentimentScore: -90,
179
- createdAt: '2026-01-01T00:00:00Z',
180
- };
181
- const event = {
182
- ...baseEvent,
183
- comments: [negativeComment],
184
- hasTests: true,
185
- isBreakingChange: false,
186
- };
187
- const signal = adapter.capture(event);
188
- expect(signal).not.toBeNull();
189
- if (!signal)
190
- throw new Error('Expected non-null signal');
191
- expect(signal.triggerTextPreview.length).toBeLessThanOrEqual(200);
192
- });
193
- // ---------------------------------------------------------------------------
194
- // PainSignal structure
195
- // ---------------------------------------------------------------------------
196
- it('returns PainSignal with correct structure', () => {
197
- const signal = adapter.capture(baseEvent);
198
- expect(signal).not.toBeNull();
199
- if (!signal)
200
- throw new Error('Expected non-null signal');
201
- expect(typeof signal.source).toBe('string');
202
- expect(typeof signal.score).toBe('number');
203
- expect(signal.timestamp).toBeTruthy();
204
- expect(typeof signal.reason).toBe('string');
205
- expect(signal.sessionId).toBe('sess-123');
206
- expect(signal.agentId).toBe('code-review-evaluator');
207
- expect(signal.domain).toBe('code-review');
208
- expect(typeof signal.severity).toBe('string');
209
- expect(typeof signal.context).toBe('object');
210
- });
211
- // ---------------------------------------------------------------------------
212
- // deriveProcessViolationScore scenarios
213
- // ---------------------------------------------------------------------------
214
- it('adds 35 when no tests and >2 files', () => {
215
- // With no tests + 3 files: +35, no other violations → process = 35 (< 40 threshold)
216
- // So primary trigger should NOT be process_violation
217
- const event = {
218
- ...baseEvent,
219
- filesChanged: [
220
- { path: 'src/a.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
221
- { path: 'src/b.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
222
- { path: 'src/c.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
223
- ],
224
- hasTests: false,
225
- isBreakingChange: false,
226
- hasSecurityReview: true,
227
- totalLinesAdded: 15,
228
- totalLinesDeleted: 15,
229
- labels: [],
230
- };
231
- const signal = adapter.capture(event);
232
- expect(signal).not.toBeNull();
233
- if (!signal)
234
- throw new Error('Expected non-null signal');
235
- // process score is 35, which is < 40, so not process_violation
236
- expect(signal.context.processViolationScore).toBe(35);
237
- expect(signal.source).not.toBe('process_violation');
238
- });
239
- it('adds 40 for breaking change without label', () => {
240
- const event = {
241
- ...baseEvent,
242
- hasTests: true,
243
- isBreakingChange: true,
244
- labels: [],
245
- hasSecurityReview: true,
246
- };
247
- const signal = adapter.capture(event);
248
- expect(signal).not.toBeNull();
249
- if (!signal)
250
- throw new Error('Expected non-null signal');
251
- expect(signal.context.processViolationScore).toBe(40);
252
- expect(signal.source).toBe('process_violation');
253
- });
254
- it('adds 50 for security changes without security review', () => {
255
- const event = {
256
- ...baseEvent,
257
- filesChanged: [{ path: 'security/auth.ts', linesAdded: 10, linesDeleted: 5, changeMagnitude: 15 }],
258
- hasTests: true,
259
- isBreakingChange: false,
260
- hasSecurityReview: false,
261
- labels: [],
262
- };
263
- const signal = adapter.capture(event);
264
- expect(signal).not.toBeNull();
265
- if (!signal)
266
- throw new Error('Expected non-null signal');
267
- expect(signal.context.processViolationScore).toBe(50);
268
- expect(signal.source).toBe('process_violation');
269
- });
270
- it('adds 20 for >500 lines changed without tests', () => {
271
- const event = {
272
- ...baseEvent,
273
- filesChanged: [
274
- { path: 'src/a.ts', linesAdded: 400, linesDeleted: 200, changeMagnitude: 600 },
275
- ],
276
- totalLinesAdded: 400,
277
- totalLinesDeleted: 200,
278
- hasTests: false,
279
- isBreakingChange: false,
280
- hasSecurityReview: true,
281
- labels: [],
282
- };
283
- const signal = adapter.capture(event);
284
- expect(signal).not.toBeNull();
285
- if (!signal)
286
- throw new Error('Expected non-null signal');
287
- // no tests + 1 file (not >2) = 0 for that rule, but >500 lines + no tests = +20
288
- expect(signal.context.processViolationScore).toBe(20);
289
- });
290
- // ---------------------------------------------------------------------------
291
- // deriveSentimentScore recency multiplier
292
- // ---------------------------------------------------------------------------
293
- it('applies recency multiplier when reviewAgeDays > 7', () => {
294
- const negativeComment = {
295
- id: 'c4',
296
- authorId: 'reviewer-1',
297
- body: 'Bad code',
298
- sentimentScore: -50,
299
- createdAt: '2026-01-01T00:00:00Z',
300
- };
301
- const recentEvent = {
302
- ...baseEvent,
303
- comments: [negativeComment],
304
- reviewAgeDays: 3,
305
- hasTests: true,
306
- isBreakingChange: false,
307
- };
308
- const oldEvent = {
309
- ...baseEvent,
310
- comments: [negativeComment],
311
- reviewAgeDays: 10,
312
- hasTests: true,
313
- isBreakingChange: false,
314
- };
315
- const recentSignal = adapter.capture(recentEvent);
316
- const oldSignal = adapter.capture(oldEvent);
317
- expect(recentSignal).not.toBeNull();
318
- if (!recentSignal)
319
- throw new Error('Expected non-null recentSignal');
320
- expect(oldSignal).not.toBeNull();
321
- if (!oldSignal)
322
- throw new Error('Expected non-null oldSignal');
323
- // Older reviews with unresolved negatives should produce higher sentiment pain
324
- expect(oldSignal.context.sentimentScore).toBeGreaterThan(recentSignal.context.sentimentScore);
325
- });
326
- // ---------------------------------------------------------------------------
327
- // traceId fallback
328
- // ---------------------------------------------------------------------------
329
- it('uses "unknown" for traceId when not provided', () => {
330
- const event = { ...baseEvent, traceId: undefined };
331
- const signal = adapter.capture(event);
332
- expect(signal).not.toBeNull();
333
- if (!signal)
334
- throw new Error('Expected non-null signal');
335
- expect(signal.traceId).toBe('unknown');
336
- });
337
- it('uses provided traceId', () => {
338
- const event = { ...baseEvent, traceId: 'trace-abc' };
339
- const signal = adapter.capture(event);
340
- expect(signal).not.toBeNull();
341
- if (!signal)
342
- throw new Error('Expected non-null signal');
343
- expect(signal.traceId).toBe('trace-abc');
344
- });
345
- });
346
- //# sourceMappingURL=code-review-pain-adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-review-pain-adapter.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-review-pain-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=openclaw-pain-adapter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openclaw-pain-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/openclaw-pain-adapter.test.ts"],"names":[],"mappings":""}