These files show the behavior of an animation for different timeCodesPerSecond values set, especially edge cases.
The animated prim has time samples from 0 to 100:
double3 xformOp:translate.timeSamples = { 0: (0, 0, 0), 100: (100, 0, 0), }
timeCodesPerSecond = -1 : timeCodesPerSecond_-1.usdatimeCodesPerSecond = 0 : timeCodesPerSecond_0.usdatimeCodesPerSecond = 1 : timeCodesPerSecond_1.usdatimeCodesPerSecond = 24 : timeCodesPerSecond_24.usdatimeCodesPerSecond = 48 : timeCodesPerSecond_48.usdatimeCodesPerSecond = 100 : timeCodesPerSecond_100.usdatimeCodesPerSecond = 101 : timeCodesPerSecond_101.usdatimeCodesPerSecond = 128 : timeCodesPerSecond_128.usda#usda 1.0
(
    customLayerData = {
        string copyright = "Copyright 2022 Apple Inc. All rights reserved."
    }
    endTimeCode = 100
    startTimeCode = 0
    subLayers = [
        @../../../_common/animated_cube_translation.usda@,
        @../../../_common/axis.usda@
    ]
    timeCodesPerSecond = 100
    upAxis = "Y"
    metersPerUnit = 0.01
    defaultPrim = "World"
)