MKRZERO only uploads in bootloader mode

I just recently purchased a Arduino MKRZERO official version (Not a third party).

For the life of me I can not get the program to upload unless I double tap the reset button and put it in bootloader mode. Once in bootloader mode it programs just fine. However, it will not upload the code when not in bootloader mode and exits with:

Sketch uses 35608 bytes (13%) of program storage space. Maximum is 262144 bytes.
Global variables use 3168 bytes (9%) of dynamic memory, leaving 29600 bytes for local variables. Maximum is 32768 bytes.
No device found on COM19
Failed uploading: uploading error: exit status 1

I have confirmed that the device is recognized in the device manager and is in-fact connected to Port 19. The device manager states:

Arduino MKRZERO (COM19)

The bottom right of the IDE will even state Aurduino MKRZERO on COM19, and does not state that it is "[disconnected]"

When in bootloader mode the device manager states:

Arduino MKRZERO bootloader (COM8)

I am aware that the COM port switches between bootloader mode and normal operation, and I have been diligent in switching it in the tools menu when it switches between the modes.

I can confirm the code is not locking up, because I have SSD1306 performing an animation that would freeze if it was locked. (The demo example for the SSD1306)

I have tried disconnecting all devices and programing the MKRZERO with no devices attached with no success.

I have tried disconnecting all devices and trying to upload the "Bare Minimum" provided example with no luck.

I have tried deleting the "packages" folder and re-downloading the board manager with no luck.

This is a log from a successful bootloader upload when it is in bootloader mode:

Sketch uses 35608 bytes (13%) of program storage space. Maximum is 262144 bytes.
Global variables use 3168 bytes (9%) of dynamic memory, leaving 29600 bytes for local variables. Maximum is 32768 bytes.
Atmel SMART device 0x10010005 found
Device       : ATSAMD21G18A
Chip ID      : 10010005
Version      : v2.0 [Arduino:XYZ] Dec 20 2016 15:36:46
Address      : 8192
Pages        : 3968
Page Size    : 64 bytes
Total Size   : 248KB
Planes       : 1
Lock Regions : 16
Locked       : none
Security     : false
Boot Flash   : true
BOD          : false
BOR          : false
Arduino      : FAST_CHIP_ERASE
Arduino      : FAST_MULTI_PAGE_WRITE
Arduino      : CAN_CHECKSUM_MEMORY_BUFFER
Erase flash
done in 0.780 seconds

Write 35608 bytes to flash (557 pages)

[===                           ] 11% (64/557 pages)
[======                        ] 22% (128/557 pages)
[==========                    ] 34% (192/557 pages)
[=============                 ] 45% (256/557 pages)
[=================             ] 57% (320/557 pages)
[====================          ] 68% (384/557 pages)
[========================      ] 80% (448/557 pages)
[===========================   ] 91% (512/557 pages)
[==============================] 100% (557/557 pages)
done in 0.275 seconds

Verify 35608 bytes of flash with checksum.
Verify successful
done in 0.029 seconds
CPU reset.

Arduino IDE Version: 2.2.1
Arduino SAMD Boards (32-bits ARM Cortex-M0+) by Arduino Version: 1.8.13

Please help.

I'm a bit confused, there should not be a need to change ports in the ports menu.

The process is that the IDE sends a reset command to the board by opening and closing the serial port (COM19 in your case) so the port that you select in the IDE should be COM19. The result of the reset command is that the bootloader is activated resulting in a new port (COM8 in your case) and that will be used for the upload.

Is that as a result of the normal upload process or because you double-tapped the reset button somewhere along the line?

If you enable verbose output during upload, you should be able to see what the IDE does.

PS
Not a MKR Zero user.