The data shows jab 1 as 1f and the hitboxes end on 2f. Jab 2 is 2f and jab 3 is 3f.
EDIT: Kinda ninja'd welp
http://opensa.dantarion.com/s4/mastercore2/index.php?char=szerosuit&mode=view104#subaction-050
According to this, it looks like the visual effects start on frame 1 and the actual move starts on frame 2.
"def game_50():" is Jab 1
def game_50():
Hitbox_026(ID=0x0, GID=0x0, Bone=0x0, Damage=1.500000, Angle=0x5C, KBG=0x64, WKB=0x17, BKB=0x0, Size=3.000000, Z=0.000000, Y=12.000000, X=13.000000, Element=0x0, Tripping=0x0, Hitlag=1.000000, SDI=1.000000, unk_=0x1, unk_=0x1, ShieldDamage=0x0, 0x0, 0x1, 0x3, 0x1, 0x4, )
Hitbox_026(ID=0x1, GID=0x0, Bone=0x0, Damage=1.500000, Angle=0x3D, KBG=0x64, WKB=0x2D, BKB=0x0, Size=3.800000, Z=0.000000, Y=11.000000, X=9.000000, Element=0x0, Tripping=0x0, Hitlag=1.000000, SDI=1.000000, unk_=0x1, unk_=0x1, ShieldDamage=0x0, 0x0, 0x1, 0x3, 0x1, 0x4, )
AsynchronousTimer_0D0(Frame=2.000000, )
RemoveAllHitboxes_014()
AsynchronousTimer_0D0(Frame=8.000000, )
unk_170(0x13, 0x2100, )
AsynchronousTimer_0D0(Frame=11.000000, )
unk_170(0xD, 0x2100, )
End_196()
Then gfx_50 which if I'm not mistaken is the visual part of the move.
def gfx_50():
AsynchronousTimer_0D0(Frame=1.000000, )
unk_070(0x100008D, 0x0, 0.000000, 14.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.800000, 0x1, 80.000000, )
unk_156(1.300000, )
AsynchronousTimer_0D0(Frame=2.000000, )
unk_060(0x100008F, 0x0, 0.000000, 14.000000, 12.500000, 0.000000, 0.000000, 0.000000, 0.900000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 360.000000, 0x1, )
AsynchronousTimer_0D0(Frame=3.000000, )
AsynchronousTimer_0D0(Frame=6.000000, )
unk_08A(0x100008D, 0x1, 0x1, )
End_196()
I interpreted this as meaning that you can see it on frame 1, but there is no hitbox until 2.
Pardon my ignorance if I've read this incorrectly, but there isn't much documentation...