{"assumptions":[{"id":"ASM-001","statement":"The rigid body has diagonal constant inertia within the declared uncertainty envelope."},{"id":"ASM-002","statement":"External torque is piecewise constant per plant step and remains within its declared component bound."},{"id":"ASM-003","statement":"The software clock and physical trace share scenario-start epoch and exact nanosecond ticks."},{"id":"ASM-004","statement":"Quatopsy and the independent baseline consume active wxyz body-to-ECI quaternions."}],"disturbance_bounds":{"external-torque":{"maximum":"0.002","minimum":"-0.002"}},"frames":[{"axes":"+X vernal-equinox reference, +Z north celestial pole, +Y completes right-handed triad","handedness":"right","id":"eci","quaternion_order":"wxyz","rotation_direction":"active"},{"axes":"+X forward, +Y right, +Z down","handedness":"right","id":"body-frd","quaternion_order":"wxyz","rotation_direction":"active"}],"guarantees":[{"id":"OBL-DEADLINE","statement":"Every required controller job completes before its next declared release."},{"id":"OBL-WATCHDOG","statement":"Three consecutive invalid sensor samples enter safe mode no later than the watchdog timeout."},{"id":"OBL-TORQUE","statement":"Every commanded reaction-wheel torque remains within 0.002 N*m per body axis."},{"id":"OBL-MOMENTUM","statement":"Reaction-wheel momentum magnitude remains within 0.02 N*m*s per wheel."},{"id":"OBL-ATTITUDE","statement":"Attitude error remains at or below 0.05 rad over the registered horizon."},{"id":"OBL-RATE","statement":"Body-rate magnitude remains at or below 0.1 rad/s over the registered horizon."}],"id":"cp-001-contract-v1","initial_conditions":{"controller-mode":"0","omega-b-x":"0","omega-b-y":"0","omega-b-z":"0","q-bi-w":"1","q-bi-x":"0","q-bi-y":"0","q-bi-z":"0"},"mappings":[{"id":"MAP-TORQUE","information_loss":[],"source":"firmware-wheel-torque-command","target":"plant-wheel-torque-input","transformation":"componentwise identity in N*m at the same nanosecond tick"},{"id":"MAP-SENSOR-VALID","information_loss":["Physical validity changes between sample instants are not represented."],"source":"physical-sensor-valid","target":"firmware-sensor-valid-sampled","transformation":"sample at each 10000000 ns sensor release"}],"parameter_bounds":{"controller-period":{"maximum":"10000000","minimum":"10000000"},"inertia-x":{"maximum":"0.02","minimum":"0.02"},"inertia-y":{"maximum":"0.024","minimum":"0.024"},"inertia-z":{"maximum":"0.028","minimum":"0.028"},"watchdog-timeout":{"maximum":"30000000","minimum":"30000000"},"wheel-momentum-limit":{"maximum":"0.02","minimum":"0.02"},"wheel-torque-limit":{"maximum":"0.002","minimum":"0.002"}},"parameters":[{"id":"inertia-x","kind":"model","unit":"kg*m^2"},{"id":"inertia-y","kind":"model","unit":"kg*m^2"},{"id":"inertia-z","kind":"model","unit":"kg*m^2"},{"id":"wheel-torque-limit","kind":"model","unit":"N*m"},{"id":"wheel-momentum-limit","kind":"model","unit":"N*m*s"},{"id":"controller-period","kind":"model","unit":"ns"},{"id":"watchdog-timeout","kind":"model","unit":"ns"},{"id":"gyro-bias","kind":"uncertainty","unit":"rad/s"},{"id":"inertia-relative-error","kind":"uncertainty","unit":"1"},{"id":"wheel-torque-scale-error","kind":"uncertainty","unit":"1"},{"id":"external-torque","kind":"disturbance","unit":"N*m"}],"schema_version":"tt.contract.v1","signals":[{"frame":"body-frd","id":"q-bi-w","kind":"state","unit":"1"},{"frame":"body-frd","id":"q-bi-x","kind":"state","unit":"1"},{"frame":"body-frd","id":"q-bi-y","kind":"state","unit":"1"},{"frame":"body-frd","id":"q-bi-z","kind":"state","unit":"1"},{"frame":"body-frd","id":"omega-b-x","kind":"state","unit":"rad/s"},{"frame":"body-frd","id":"omega-b-y","kind":"state","unit":"rad/s"},{"frame":"body-frd","id":"omega-b-z","kind":"state","unit":"rad/s"},{"frame":"body-frd","id":"firmware-wheel-torque-command","kind":"command","unit":"N*m"},{"frame":"body-frd","id":"plant-wheel-torque-input","kind":"command","unit":"N*m"},{"frame":"body-frd","id":"gyro-rate","kind":"sensor","unit":"rad/s"},{"frame":null,"id":"physical-sensor-valid","kind":"sensor","unit":"1"},{"frame":null,"id":"firmware-sensor-valid-sampled","kind":"sensor","unit":"1"},{"frame":null,"id":"controller-mode","kind":"mode","unit":"1"},{"frame":null,"id":"watchdog-expired","kind":"fault","unit":"1"},{"frame":null,"id":"wheel-saturated","kind":"fault","unit":"1"},{"frame":"body-frd","id":"attitude-error","kind":"property","unit":"rad"}],"time":{"epoch":"scenario-start","jitter_bound":"0","sample_semantics":"Sensor and plant values at tick k are sampled before commands released at tick k are applied.","tick_semantics":"Integer ticks denote left-closed scheduler release instants from scenario start.","unit":"ns"},"uncertainty_bounds":{"gyro-bias":{"maximum":"0.001","minimum":"-0.001"},"inertia-relative-error":{"maximum":"0.05","minimum":"-0.05"},"wheel-torque-scale-error":{"maximum":"0.02","minimum":"-0.02"}}}