@@ -3,15 +3,34 @@ import { describe, it } from "node:test";
33import type { AgentResult } from "../types.js" ;
44import { analyzeConvergence , recommend } from "./convergence.js" ;
55
6+ const DIFF_A = `diff --git a/a.ts b/a.ts
7+ --- a/a.ts
8+ +++ b/a.ts
9+ @@ -1 +1 @@
10+ +const x = 1;` ;
11+
12+ const DIFF_A_VARIANT = `diff --git a/a.ts b/a.ts
13+ --- a/a.ts
14+ +++ b/a.ts
15+ @@ -1 +1 @@
16+ +const x = 1;
17+ +const extra = true;` ;
18+
19+ const DIFF_B = `diff --git a/b.ts b/b.ts
20+ --- a/b.ts
21+ +++ b/b.ts
22+ @@ -1 +1 @@
23+ +const y = 2;` ;
24+
625function makeAgent ( overrides : Partial < AgentResult > & { id : number } ) : AgentResult {
726 return {
827 worktree : `/tmp/agent-${ overrides . id } ` ,
928 status : "success" ,
1029 exitCode : 0 ,
1130 duration : 5000 ,
1231 output : "" ,
13- diff : "some diff" ,
14- filesChanged : [ "src/index .ts" ] ,
32+ diff : DIFF_A ,
33+ filesChanged : [ "a .ts" ] ,
1534 linesAdded : 10 ,
1635 linesRemoved : 5 ,
1736 ...overrides ,
@@ -33,44 +52,41 @@ describe("analyzeConvergence", () => {
3352 assert . deepEqual ( result , [ ] ) ;
3453 } ) ;
3554
36- it ( "groups agents that changed the same files " , ( ) => {
55+ it ( "groups agents with similar diffs together " , ( ) => {
3756 const agents = [
38- makeAgent ( { id : 1 , filesChanged : [ "a.ts" , "b .ts"] } ) ,
39- makeAgent ( { id : 2 , filesChanged : [ "a.ts" , "b .ts"] } ) ,
40- makeAgent ( { id : 3 , filesChanged : [ "c .ts" ] } ) ,
57+ makeAgent ( { id : 1 , diff : DIFF_A , filesChanged : [ "a.ts" ] } ) ,
58+ makeAgent ( { id : 2 , diff : DIFF_A , filesChanged : [ "a.ts" ] } ) ,
59+ makeAgent ( { id : 3 , diff : DIFF_B , filesChanged : [ "b .ts" ] } ) ,
4160 ] ;
4261 const groups = analyzeConvergence ( agents ) ;
4362
4463 assert . equal ( groups . length , 2 ) ;
45- assert . deepEqual ( groups [ 0 ] ! . agents , [ 1 , 2 ] ) ;
46- assert . ok ( groups [ 0 ] ! . similarity > groups [ 1 ] ! . similarity ) ;
47- assert . deepEqual ( groups [ 1 ] ! . agents , [ 3 ] ) ;
64+ // Agents 1,2 have identical diffs — should be in the same group
65+ const largestGroup = groups [ 0 ] ! ;
66+ assert . ok ( largestGroup . agents . includes ( 1 ) ) ;
67+ assert . ok ( largestGroup . agents . includes ( 2 ) ) ;
68+ assert . ok ( largestGroup . similarity > groups [ 1 ] ! . similarity ) ;
4869 } ) ;
4970
50- it ( "handles file order differences" , ( ) => {
51- const agents = [
52- makeAgent ( { id : 1 , filesChanged : [ "b.ts" , "a.ts" ] } ) ,
53- makeAgent ( { id : 2 , filesChanged : [ "a.ts" , "b.ts" ] } ) ,
54- ] ;
71+ it ( "clusters agents with identical diffs" , ( ) => {
72+ const agents = [ makeAgent ( { id : 1 , diff : DIFF_A } ) , makeAgent ( { id : 2 , diff : DIFF_A } ) ] ;
5573 const groups = analyzeConvergence ( agents ) ;
5674
5775 assert . equal ( groups . length , 1 ) ;
58- assert . deepEqual ( groups [ 0 ] ! . agents , [ 1 , 2 ] ) ;
59- assert . equal ( groups [ 0 ] ! . similarity , 1 ) ;
76+ assert . deepEqual ( groups [ 0 ] ! . agents . sort ( ) , [ 1 , 2 ] ) ;
6077 } ) ;
6178
62- it ( "labels strong consensus at 80%+ " , ( ) => {
79+ it ( "labels strong consensus correctly " , ( ) => {
6380 const agents = [
64- makeAgent ( { id : 1 , filesChanged : [ "a.ts" ] } ) ,
65- makeAgent ( { id : 2 , filesChanged : [ "a.ts" ] } ) ,
66- makeAgent ( { id : 3 , filesChanged : [ "a.ts" ] } ) ,
67- makeAgent ( { id : 4 , filesChanged : [ "a.ts" ] } ) ,
68- makeAgent ( { id : 5 , filesChanged : [ "b.ts" ] } ) ,
81+ makeAgent ( { id : 1 , diff : DIFF_A } ) ,
82+ makeAgent ( { id : 2 , diff : DIFF_A } ) ,
83+ makeAgent ( { id : 3 , diff : DIFF_A } ) ,
84+ makeAgent ( { id : 4 , diff : DIFF_A } ) ,
85+ makeAgent ( { id : 5 , diff : DIFF_B , filesChanged : [ "b.ts" ] } ) ,
6986 ] ;
7087 const groups = analyzeConvergence ( agents ) ;
7188
7289 assert . ok ( groups [ 0 ] ! . description . includes ( "Strong consensus" ) ) ;
73- assert . ok ( groups [ 1 ] ! . description . includes ( "Divergent" ) ) ;
7490 } ) ;
7591} ) ;
7692
@@ -82,8 +98,8 @@ describe("recommend", () => {
8298
8399 it ( "prefers agents that pass tests" , ( ) => {
84100 const agents = [
85- makeAgent ( { id : 1 , linesAdded : 20 , linesRemoved : 10 } ) ,
86- makeAgent ( { id : 2 , linesAdded : 5 , linesRemoved : 2 } ) ,
101+ makeAgent ( { id : 1 , diff : DIFF_A , linesAdded : 20 , linesRemoved : 10 } ) ,
102+ makeAgent ( { id : 2 , diff : DIFF_B , linesAdded : 5 , linesRemoved : 2 , filesChanged : [ "b.ts" ] } ) ,
87103 ] ;
88104 const tests = [
89105 { agentId : 1 , passed : true } ,
@@ -96,9 +112,15 @@ describe("recommend", () => {
96112
97113 it ( "prefers agents in larger convergence group when tests are equal" , ( ) => {
98114 const agents = [
99- makeAgent ( { id : 1 , filesChanged : [ "a.ts" ] , linesAdded : 10 , linesRemoved : 5 } ) ,
100- makeAgent ( { id : 2 , filesChanged : [ "a.ts" ] , linesAdded : 10 , linesRemoved : 5 } ) ,
101- makeAgent ( { id : 3 , filesChanged : [ "b.ts" ] , linesAdded : 10 , linesRemoved : 5 } ) ,
115+ makeAgent ( { id : 1 , diff : DIFF_A , filesChanged : [ "a.ts" ] , linesAdded : 10 , linesRemoved : 5 } ) ,
116+ makeAgent ( { id : 2 , diff : DIFF_A , filesChanged : [ "a.ts" ] , linesAdded : 10 , linesRemoved : 5 } ) ,
117+ makeAgent ( {
118+ id : 3 ,
119+ diff : DIFF_B ,
120+ filesChanged : [ "b.ts" ] ,
121+ linesAdded : 10 ,
122+ linesRemoved : 5 ,
123+ } ) ,
102124 ] ;
103125 const tests = [
104126 { agentId : 1 , passed : true } ,
@@ -114,12 +136,11 @@ describe("recommend", () => {
114136
115137 it ( "prefers smaller diffs as tiebreaker" , ( ) => {
116138 const agents = [
117- makeAgent ( { id : 1 , filesChanged : [ "a.ts" ] , linesAdded : 50 , linesRemoved : 20 } ) ,
118- makeAgent ( { id : 2 , filesChanged : [ "a.ts" ] , linesAdded : 5 , linesRemoved : 2 } ) ,
139+ makeAgent ( { id : 1 , diff : DIFF_A , linesAdded : 50 , linesRemoved : 20 } ) ,
140+ makeAgent ( { id : 2 , diff : DIFF_A , linesAdded : 5 , linesRemoved : 2 } ) ,
119141 ] ;
120142 const convergence = analyzeConvergence ( agents ) ;
121143
122- // No test results — convergence is equal, so diff size decides
123144 assert . equal ( recommend ( agents , [ ] , convergence ) , 2 ) ;
124145 } ) ;
125146} ) ;
0 commit comments