I'm going to try to explain what is happening in the code. If you look at the source, line 2578 of v0.22, you will see that a Group is practically an Item, with just a small amount of extra code. As an Item, it can have children (see line 2137). When you ask for the position of a Group, it calls Item.getPosition() (line 1881), which calls this.getBounds().getCenter(). getBounds (line 2325) runs through the children and finds the minimum and maximum x & y values for the children and returns a Rectangle containing x, y, width, & height. getCenter then finds the midpoint of that Rectangle.
It's not a design choice that the position of a Group will change as its children move, that is simply a function of how Items are defined: "position" is the center of the bounds, which is the bounding Rectangle that contains all the children. As you add children, the bounds may change, which would cause the center (aka position) to change.
So let's step through an example...I've removed path2 and circle2 to simplify the problem, leaving just path and circle.
var path = new paper.Path(new paper.Point(0, 0), new paper.Point(100, 0));
alert('path.bounds.x ' + path.bounds.x); // 0
alert('path.bounds.width ' + path.bounds.width); // 100
alert('path.position.x ' + path.position.x); // 50
var circle = new paper.Path.Circle(new paper.Point(0, 0), 50);
alert('circle.bounds.x ' + circle.bounds.x); // -50 The circle has a radius of 50, and is centered at (0, 0), so it reaches between -50 and +50 in the x dimension.
alert('circle.bounds.width ' + circle.bounds.width); // 100
alert('circle.position.x ' + circle.position.x); // 0
//Note how the position.x is always the bounds.x + 0.5*bounds.width...so the x position is at the x-center of the Path.
var group = new paper.Group();
alert('group.bounds.x without children ' + group.bounds.x); // 0
alert('group.bounds.width without children ' + group.bounds.width); // 0
alert('group.position.x without children ' + group.bounds.getCenter().x); // 0 so a newly created group has no width and is at x = 0
group.addChild(path);
alert('group.bounds.x with path ' + group.bounds.x); // 0
alert('group.bounds.width with path ' + group.bounds.width); // 100
alert('group.position.x with path ' + group.bounds.getCenter().x); // 50
// A Group with a single child has the same bounds and position as that child.
group.addChild(circle);
alert('group.bounds.x with path and circle ' + group.bounds.x); // -50
alert('group.bounds.width with path and circle ' + group.bounds.width); // 150
alert('group.position.x with path and circle ' + group.bounds.getCenter().x); // 25
// The bounds.x for a Group with multiple children is equal to the minimum bounds.x in all the children. The circle has a bounds.x of -50, which is lower than the path's bounds.x of 0, so the group's bounds.x is -50
// The circle stretches between -50 and +50 in x, while path stretches from 0 to 100 in x. Therefore the group stretches from -50 to 100 in x, giving it a width of 150.
// The position of the group is then the center of its bounds rectangle...which is bounds.x + 0.5*bounds.width = -50 + 0.5 * 150 = -50 + 75 = 25. Thus 25 is exactly what we expect for group.position.x
The group.position.x is not always 50...you can translate and reposition the group and watch it's position.x change. Or as you add and remove children its position can change.
Note that the group has multiple children, not just the circle. So the group's bounds must encompass all of its children, and therefore the group's position (i.e., its center) is a function of all the children. If the group's only child was the circle, then the group's position would be the same as the circle's position.
Have you tried moving the group more than 50 in x? That might help your intuition/understanding. group.position = new paper.Point(500, 150);
By saying you want the group to be fixed in place, you seem to be assuming that the group has its own x-y axes that children can be positioned upon....then the group would be positioned on the canvas's absolute x-y axes, and the children would be positioned on the group's relative x-y axes. But a Group is (practically) just an Item with children...it is better to think of a Group as a way to distribute rotate/translate/transform/scale operations among several (children) Items.
What you are describing is not a paperjs Group. You may want to extend a Group to create the thing you are talking about (or put in a feature request on github), but I would recommend not re-defining "position" from its current definition of the center of the bounds.
What are you trying to do in the first place? Your original code successfully put the group in the center of the view. Did you want the circle in the center of the view instead?
Have you looked at code that successfully uses Groups? Often once a Group has been created it does not gain children, lose children, or have its children moved except when the entire Group moves...thus avoiding such concerns about the recalculation of "position".
or
hope this helps,
~Ryan