{"id":"v001","input":{"inbound_course":"360 deg","heading":"90 deg","turns":"right"},"expect":{"result.entry":"direct","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v002","input":{"inbound_course":"360 deg","heading":"150 deg","turns":"right"},"expect":{"result.entry":"teardrop","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v003","input":{"inbound_course":"360 deg","heading":"240 deg","turns":"right"},"expect":{"result.entry":"parallel","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v004","input":{"inbound_course":"360 deg","heading":"210 deg","turns":"left"},"expect":{"result.entry":"teardrop","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v005","input":{"inbound_course":"360 deg","heading":"120 deg","turns":"left"},"expect":{"result.entry":"parallel","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v006","input":{"inbound_course":"90 deg","heading":"90 deg","turns":"left"},"expect":{"result.entry":"direct","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v007","input":{"inbound_course":"270 deg","heading":"30 deg","turns":"right"},"expect":{"result.entry":"teardrop","ok":true},"source":"AIM 5-3-8 figure 5-3-2 sectors and table 5-3-1 speeds, applied by hand","sourceVersion":"AIM (2026)","tolerance":{}}
{"id":"v008","input":{"inbound_course":"45 deg","heading":"200 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.outbound_course.value":225.0,"result.teardrop_heading.value":195.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v009","input":{"inbound_course":"45 deg","heading":"260 deg","turns":"right"},"expect":{"ok":true,"result.entry":"parallel","result.outbound_course.value":225.0,"result.teardrop_heading.value":195.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v010","input":{"inbound_course":"45 deg","heading":"120 deg","turns":"right"},"expect":{"ok":true,"result.entry":"direct","result.outbound_course.value":225.0,"result.teardrop_heading.value":195.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v011","input":{"inbound_course":"270 deg","heading":"300 deg","turns":"right"},"expect":{"ok":true,"result.entry":"direct","result.outbound_course.value":90.0,"result.teardrop_heading.value":60.0,"result.parallel_heading.value":90.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v012","input":{"inbound_course":"270 deg","heading":"60 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.outbound_course.value":90.0,"result.teardrop_heading.value":60.0,"result.parallel_heading.value":90.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v013","input":{"inbound_course":"270 deg","heading":"150 deg","turns":"right"},"expect":{"ok":true,"result.entry":"parallel","result.outbound_course.value":90.0,"result.teardrop_heading.value":60.0,"result.parallel_heading.value":90.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v014","input":{"inbound_course":"123 deg","heading":"10 deg","turns":"right"},"expect":{"ok":true,"result.entry":"parallel","result.outbound_course.value":303.0,"result.teardrop_heading.value":273.0,"result.parallel_heading.value":303.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v015","input":{"inbound_course":"123 deg","heading":"250 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.outbound_course.value":303.0,"result.teardrop_heading.value":273.0,"result.parallel_heading.value":303.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v016","input":{"inbound_course":"45 deg","heading":"250 deg","turns":"left"},"expect":{"ok":true,"result.entry":"teardrop","result.outbound_course.value":225.0,"result.teardrop_heading.value":255.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v017","input":{"inbound_course":"45 deg","heading":"150 deg","turns":"left"},"expect":{"ok":true,"result.entry":"parallel","result.outbound_course.value":225.0,"result.teardrop_heading.value":255.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v018","input":{"inbound_course":"45 deg","heading":"330 deg","turns":"left"},"expect":{"ok":true,"result.entry":"direct","result.outbound_course.value":225.0,"result.teardrop_heading.value":255.0,"result.parallel_heading.value":225.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v019","input":{"inbound_course":"180 deg","heading":"90 deg","turns":"left"},"expect":{"ok":true,"result.entry":"direct","result.outbound_course.value":0.0,"result.teardrop_heading.value":30.0,"result.parallel_heading.value":0.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v020","input":{"inbound_course":"180 deg","heading":"300 deg","turns":"left"},"expect":{"ok":true,"result.entry":"parallel","result.outbound_course.value":0.0,"result.teardrop_heading.value":30.0,"result.parallel_heading.value":0.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v021","input":{"inbound_course":"180 deg","heading":"20 deg","turns":"left"},"expect":{"ok":true,"result.entry":"teardrop","result.outbound_course.value":0.0,"result.teardrop_heading.value":30.0,"result.parallel_heading.value":0.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py): the side of the holding course and of the 70-degree line the aircraft comes from","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09}}}
{"id":"v022","input":{"inbound_course":"234 deg","heading":"234 deg","turns":"right"},"expect":{"ok":true,"result.entry":"direct","result.outbound_course.value":54.0,"result.teardrop_heading.value":24.0,"result.parallel_heading.value":54.0,"result.relative_angle.value":0.0},"source":"TC AIM (TP 14371E, AIM 2026-1) RAC 10.2 example 2: arriving on track 234 deg at ZHZ, make a right turn and hold on an inbound track of 234 deg (the RAC 10.5 sector 3 direct entry)","sourceVersion":"TC AIM 2026-1, effective March 19, 2026","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v023","input":{"inbound_course":"360 deg","heading":"107 deg","turns":"right"},"expect":{"ok":true,"result.entry":"direct","result.alternative":"teardrop","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":107.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v024","input":{"inbound_course":"360 deg","heading":"113 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.alternative":"direct","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":113.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v025","input":{"inbound_course":"360 deg","heading":"293 deg","turns":"right"},"expect":{"ok":true,"result.entry":"direct","result.alternative":"parallel","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":-67.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v026","input":{"inbound_course":"360 deg","heading":"287 deg","turns":"right"},"expect":{"ok":true,"result.entry":"parallel","result.alternative":"direct","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":-73.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v027","input":{"inbound_course":"360 deg","heading":"176 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.alternative":"parallel","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":176.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v028","input":{"inbound_course":"360 deg","heading":"184 deg","turns":"right"},"expect":{"ok":true,"result.entry":"parallel","result.alternative":"teardrop","result.outbound_course.value":180.0,"result.teardrop_heading.value":150.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":-176.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v029","input":{"inbound_course":"360 deg","heading":"253 deg","turns":"left"},"expect":{"ok":true,"result.entry":"direct","result.alternative":"teardrop","result.outbound_course.value":180.0,"result.teardrop_heading.value":210.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":-107.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v030","input":{"inbound_course":"360 deg","heading":"73 deg","turns":"left"},"expect":{"ok":true,"result.entry":"parallel","result.alternative":"direct","result.outbound_course.value":180.0,"result.teardrop_heading.value":210.0,"result.parallel_heading.value":180.0,"result.relative_angle.value":73.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.outbound_course.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09},"result.parallel_heading.value":{"abs":1e-09},"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v031","input":{"inbound_course":"090 deg","heading":"270 deg","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.alternative":"parallel","result.relative_angle.value":180.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5; exactly on the teardrop/parallel line the tool names the teardrop for either turn direction, so a left hold mirrors a right one","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v032","input":{"inbound_course":"090 deg","heading":"270 deg","turns":"left"},"expect":{"ok":true,"result.entry":"teardrop","result.alternative":"parallel","result.relative_angle.value":180.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py), with the 5-degree zone of flexibility on the sector boundaries from ICAO Doc 8168 Vol I and TC AIM RAC 10.5; exactly on the teardrop/parallel line the tool names the teardrop for either turn direction, so a left hold mirrors a right one","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.relative_angle.value":{"abs":1e-09}}}
{"id":"v033","input":{"inbound_course":"0 deg","heading":"3 rad","turns":"right"},"expect":{"ok":true,"result.entry":"teardrop","result.relative_angle.value":171.88733853924697,"result.teardrop_heading.value":150.0},"source":"AIM 5-3-8j FIG 5-3-4 sectors worked by position in Python (tools/vectors/gen_hold_part107.py); 3 rad = 171.887 deg","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{"result.relative_angle.value":{"abs":1e-09},"result.teardrop_heading.value":{"abs":1e-09}}}
{"id":"v034","input":{"inbound_course":"360 deg"},"expect":{"ok":false,"error.code":"INVALID_INPUT","error.field":"/heading"},"source":"Required inputs: an entry needs both the inbound course and the heading to the fix","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{}}
{"id":"v035","input":{"heading":"90 deg"},"expect":{"ok":false,"error.code":"INVALID_INPUT","error.field":"/inbound_course"},"source":"Required inputs: an entry needs both the inbound course and the heading to the fix","sourceVersion":"AIM basic with Change 3 (July 9, 2026)","tolerance":{}}
