Your gestures should be controlled by a base animator. You can find this asset at:
VRChat SDK - Avatars/Samples/AV3 Demo Assets/Animation/Controllers/vrc_AvatarV3HandsLayer
If you don’t use a gesture animator (Finger tracking only), the SDK automatically uses the above.

Layer 0 (AllParts) is a mask. 1 is Left hand, 2 is right hand.
Also attaching my basic one here that doesnt use any state:
Basic Gesture Controller.controller
I install my base hand animations via a prefab with MA Merge animator set to Replace. It’s A-OK to add this to your avatar descriptor instead of doing this though.

In this base animator I do all my manually animated hand poses.
Example asset used here if you want to pick up n break down how it works yourself: https://booth.artificialincarnation.com/items/8535257
By using layer override logic, we can append layers with prop controlled overrides. (Without more complex logic, this may break if you equip multiple props at once)

Left hand layer
On this layer we have an off and and on state, both with the actual hand pose animated.

The default weight of the Hand L and R pose layers are 0

Its important that the base layer be empty here. Layer 0 can’t have it’s weight adjusted. Modular Avatar will see this layer during append and delete it.