{"id":"v001","input":{"total_weight":"2250 lb","cg":"84.3 in","from_arm":"150 in","to_arm":"90 in","weight":"50 lb"},"expect":{"result.new_cg.value":82.96666666666667,"result.weight.value":50,"result.cg_change.value":-1.3333333333333286,"ok":true},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{"result.new_cg.value":{"rel":0,"abs":1e-09},"result.weight.value":{"rel":0,"abs":1e-09},"result.cg_change.value":{"rel":0,"abs":1e-09}}}
{"id":"v002","input":{"total_weight":"2250 lb","cg":"84.3 in","from_arm":"90 in","to_arm":"150 in","weight":"20 lb"},"expect":{"result.new_cg.value":84.83333333333333,"result.weight.value":20,"result.cg_change.value":0.5333333333333314,"ok":true},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{"result.new_cg.value":{"rel":0,"abs":1e-09},"result.weight.value":{"rel":0,"abs":1e-09},"result.cg_change.value":{"rel":0,"abs":1e-09}}}
{"id":"v003","input":{"total_weight":"7800 lb","cg":"81.5 in","from_arm":"150 in","to_arm":"30 in","target_cg":"80.5 in"},"expect":{"result.new_cg.value":80.5,"result.weight.value":65.0,"result.cg_change.value":-1.0,"ok":true},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{"result.new_cg.value":{"rel":0,"abs":1e-09},"result.weight.value":{"rel":0,"abs":1e-09},"result.cg_change.value":{"rel":0,"abs":1e-09}}}
{"id":"v004","input":{"total_weight":"3100 lb","cg":"92.0 in","from_arm":"140 in","to_arm":"70 in","target_cg":"90.0 in"},"expect":{"result.new_cg.value":90.0,"result.weight.value":88.57142857142857,"result.cg_change.value":-2.0,"ok":true},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{"result.new_cg.value":{"rel":0,"abs":1e-09},"result.weight.value":{"rel":0,"abs":1e-09},"result.cg_change.value":{"rel":0,"abs":1e-09}}}
{"id":"v005","input":{"total_weight":"1650 lb","cg":"38.2 in","from_arm":"20 in","to_arm":"48 in","weight":"30 lb"},"expect":{"result.new_cg.value":38.70909090909091,"result.weight.value":30,"result.cg_change.value":0.5090909090909079,"ok":true},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{"result.new_cg.value":{"rel":0,"abs":1e-09},"result.weight.value":{"rel":0,"abs":1e-09},"result.cg_change.value":{"rel":0,"abs":1e-09}}}
{"id":"v006","input":{"total_weight":"2250 lb","cg":"84.3 in","from_arm":"150 in","to_arm":"90 in","target_cg":"86 in"},"expect":{"ok":false,"error.code":"NO_SOLUTION"},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{}}
{"id":"v007","input":{"total_weight":"2250 lb","cg":"84.3 in","from_arm":"150 in","to_arm":"150 in","weight":"10 lb"},"expect":{"ok":false,"error.code":"INVALID_INPUT"},"source":"Weight-shift and ballast proportions worked in Python (tools/vectors/gen_shift.py)","sourceVersion":"2026","tolerance":{}}
