Skip to main content

animsmith_core/
lib.rs

1//! Engine-agnostic animation linting primitives for Rust pipelines.
2//!
3//! This crate is the embedding boundary for animsmith. It owns the core
4//! data model ([`Document`], [`Skeleton`], [`Clip`], [`Track`]), rig-role
5//! resolution ([`detect_profile`], [`ResolvedRoles::from_names`]),
6//! typed configuration ([`Config`]), measurement generation
7//! ([`measure::measure_document`]), versioned result envelopes
8//! ([`contract::MeasureEnvelope`], [`contract::LintEnvelope`]), measurement diffs
9//! ([`diff::diff_measurements`]), structured findings ([`Finding`]), and
10//! check execution ([`CheckCtx`], [`all_checks`], [`evaluate_checks`]).
11//! The [`source_facts`] module owns the bounded, format-neutral V1 vocabulary
12//! that format loaders bind to the exact primary bytes in an immutable
13//! [`LoadedSource`]. A mutable normalized [`Document`] does not reconstruct
14//! importer-sensitive source declarations; consuming the wrapper as a document
15//! deliberately discards those facts. The separate [`dependency_closure`]
16//! sidecar records bounded, same-load primary/external content identities over
17//! the raw resource-declaration domain; format crates own rooted I/O while core
18//! owns its validated value and canonical digest contract. The borrowing facts
19//! view reuses the canonical [`model::SourceSkeletonAssets`] table and remains
20//! separate from scale's operation-specific capability and proof ledgers.
21//! The opt-in [`bake_static_mesh_transforms`] operation canonicalizes supported
22//! unanimated, unskinned mesh scenes into identity-root geometry and returns
23//! deterministic producer evidence.
24//! The opt-in [`transform::prune_constant_tracks`] helper removes only
25//! interpolation-aware constant-track candidates whose sampled local and
26//! model-space pose evidence remains within its documented tolerances.
27//! The [`scale`] module owns the format-neutral plan/proof contracts for the
28//! two distinct DESIGN.md Appendix D scale operations —
29//! [`scale::ScaleOperation::WholeDocumentLinearUnits`] and
30//! [`scale::ScaleOperation::RestBindUniformScale`] — through pure, fail-closed
31//! [`scale::plan_scale`] and independent [`scale::prove_scale`]. A format
32//! frontend owns exact source rewriting and hands the reloaded emitted
33//! document back through [`scale::ScaleCandidate::from_document`]; core does
34//! not expose a production candidate builder, choose named versus indexed
35//! selectors, publish artifacts, or write files. Core does own the
36//! format-neutral mapping from an already chosen exact named assembly selector
37//! to its source root and fully governed skin through
38//! [`scale::resolve_assembly_scale_named_selector`].
39//! The [`animsmith-gltf`] and [`animsmith-fbx`] loader crates translate file
40//! formats into this model; their docs.rs pages continue the library path for
41//! format-specific loading and, for glTF, writing.
42//!
43//! The [embedding guide] explains crate selection and integration
44//! boundaries. The [pipeline scenario guide] shows where an embedded gate
45//! fits in marketplace intake, mocap cleanup, outsourced acceptance, and CI.
46//! A [runnable example] exercises the complete library flow.
47//!
48//! The directional-speed policy V1 API freezes source-basis vectors as
49//! orientation witnesses for raw collection-output V2 +X/+Z endpoint
50//! displacement. Basis magnitudes are nonsemantic; future evaluation uses
51//! unit axes for heading and the raw evidence identity for binding.
52//!
53//! [embedding guide]: https://github.com/mmannerm/animsmith/blob/main/docs/embedding.md
54//! [pipeline scenario guide]: https://github.com/mmannerm/animsmith/blob/main/docs/pipeline-scenarios.md
55//! [runnable example]: https://github.com/mmannerm/animsmith/blob/main/crates/animsmith/examples/embed.rs
56//! [`animsmith-gltf`]: https://docs.rs/animsmith-gltf
57//! [`animsmith-fbx`]: https://docs.rs/animsmith-fbx
58//!
59//! # Quick start
60//!
61//! After a format crate has loaded a [`Document`], resolve rig roles, build
62//! a [`Config`] from the host pipeline's contract, and share one
63//! [`MetricGrids`] between measurements, checks, and optional report
64//! generation:
65//!
66//! ```
67//! use animsmith_core::{
68//!     CheckCtx, CheckSelection, Config, Document, MetricGrids, all_checks,
69//!     evaluate_checks, resolve_configured_roles,
70//! };
71//! use animsmith_core::measure::measure_document;
72//!
73//! let doc = Document::default();
74//! let config = Config::default();
75//! config.validate()?;
76//! let roles = resolve_configured_roles(&doc.skeleton, &config.rig);
77//! let grids = MetricGrids::new(&doc);
78//!
79//! let measurements = measure_document(&grids, &roles, &config);
80//! let ctx = CheckCtx::new(&grids, &roles, &config);
81//! let results = evaluate_checks(&ctx, &all_checks(), CheckSelection::All)?;
82//!
83//! assert!(measurements.is_empty());
84//! assert!(results.iter().all(|result| result.findings().is_empty()));
85//! # Ok::<(), animsmith_core::EvaluationError>(())
86//! ```
87//!
88//! [`CheckCtx::new`] consumes already-resolved roles; it does not interpret
89//! [`Config::rig`] automatically. Frontends may use [`detect_profile`],
90//! [`resolve_configured_roles`] for the same named-profile plus inline-override
91//! policy as the CLI. Missing prerequisites are represented as typed coverage
92//! gaps rather than false findings.
93//!
94//! # API status
95//!
96//! The Rust API is pre-1.0 and may still change before the first stable
97//! release. The intended extension points are the data model,
98//! configuration types, measurement and diff APIs, rig-profile APIs, the
99//! [`Check`] trait for custom checks, and the check catalog functions
100//! re-exported from this crate root. Built-in check ids, CLI exit-code
101//! semantics, and the shared versioned JSON envelope/schema ids are treated
102//! as the most stable automation contracts. The [`contract`] module owns the
103//! same envelope types and immutable identities for CLI and embedded
104//! producers. The scene-asset
105//! structs in [`model`] and the pipeline-mechanical helpers in
106//! [`transform`] and [`static_bake`] are public so the loader, writer, and CLI crates can
107//! share the same model, but they are less settled than the
108//! measurement/check embedding flow while the crate is pre-1.0. Metric
109//! formulas and individual Rust symbols are still subject to pre-1.0
110//! refinement.
111//!
112//! Public APIs that return [`Result`] document their `# Errors` cases.
113//! Index-based accessors and transform helpers that rely on
114//! loader-established invariants document their `# Panics` contracts.
115//! Loader-valid documents from the format crates should flow through
116//! checking, sampling, and measurement without panicking on untrusted
117//! input.
118
119#![warn(missing_docs)]
120
121pub mod assembly;
122mod bounded_deserialize;
123pub mod check;
124mod checks;
125pub mod collection;
126pub mod config;
127pub mod contact_fragment;
128pub mod contract;
129pub mod dependency_closure;
130pub mod diff;
131pub mod directional_speed_evaluation;
132pub mod directional_speed_policy;
133pub mod engine_contract;
134pub mod evaluation;
135pub mod finding;
136#[cfg(feature = "fixtures")]
137pub mod fixtures;
138pub mod measure;
139pub mod metrics;
140pub mod model;
141pub mod prediction;
142pub mod profile;
143pub mod sample;
144pub mod scale;
145pub mod skinned_canonical;
146pub mod source_facts;
147pub mod stance_support;
148pub mod static_bake;
149pub mod transform;
150pub mod transition_family;
151/// Strict core-only transition-pose evaluation and skeleton-basis identity.
152pub mod transition_pose_evaluation;
153
154pub use check::{Check, CheckCtx, all_checks, mechanical_checks};
155pub use collection::{
156    COLLECTION_MANIFEST_V1_BUDGET_ID, COLLECTION_MANIFEST_V1_ID,
157    COLLECTION_MANIFEST_V1_MAX_AGGREGATE_MEMBERS, COLLECTION_MANIFEST_V1_MAX_AGGREGATE_WORK,
158    COLLECTION_MANIFEST_V1_MAX_CLIPS, COLLECTION_MANIFEST_V1_MAX_IDENTIFIER_BYTES,
159    COLLECTION_MANIFEST_V1_MAX_MANIFEST_BYTES, COLLECTION_MANIFEST_V1_MAX_RUNTIME_SETS,
160    COLLECTION_MANIFEST_V1_MAX_SOURCES, COLLECTION_MANIFEST_V1_MAX_TAKE_NAME_BYTES,
161    COLLECTION_MANIFEST_V1_SCHEMA_VERSION, CollectionClipV1, CollectionDigestPinV1, CollectionIdV1,
162    CollectionLogicalIdV1, CollectionManifestBudgetV1, CollectionManifestError,
163    CollectionManifestV1, CollectionRuntimeSetKindV1, CollectionRuntimeSetV1,
164    CollectionSourceKeyV1, CollectionSourceV1,
165};
166pub use config::{
167    ClipExpectations, Config, ConfigValidationError, GaitGroup, MovementOwner, Pinned,
168    RuntimeNodeSelectorResolution, RuntimeNodeSelectors, RuntimeNodesConfig, SeveritySetting,
169    SyncGroup, TimeComplementSettings,
170};
171pub use contact_fragment::{
172    CONTACT_FRAGMENT_V1_ID, CONTACT_FRAGMENT_V1_MAX_CANONICAL_BYTES, CONTACT_FRAGMENT_V1_MAX_DEPTH,
173    CONTACT_FRAGMENT_V1_MAX_EVENTS, CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_BYTES,
174    CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_DEPTH, CONTACT_FRAGMENT_V1_MAX_EXTENSIONS,
175    CONTACT_FRAGMENT_V1_MAX_IDENTIFIER_BYTES, CONTACT_FRAGMENT_V1_MAX_SAFE_INTEGER,
176    CONTACT_FRAGMENT_V1_MAX_SOURCE_BYTES, CONTACT_FRAGMENT_V1_MAX_TEXT_BYTES,
177    CONTACT_FRAGMENT_V1_SCHEMA_VERSION, ContactClipReferenceV1, ContactEventKindV1, ContactEventV1,
178    ContactEventWindowV1, ContactExtensionV1, ContactFragmentError, ContactFragmentV1,
179    ContactPhaseV1, ContactProducerV1, ContactRoleV1,
180};
181pub use contract::{
182    DiffEnvelope, InputIdentity, LintEnvelope, LintFileReport, MEASUREMENTS_SCHEMA_ID,
183    MEASUREMENTS_SCHEMA_VERSION, MeasureEnvelope, MeasureFileReport, MeasurementContract,
184    MeasurementContractError, MeasurementFileError, MeasurementReportError, MeasurementReportFile,
185    MeasurementReportInput, MeasurementReportReadError, OUTPUT_SCHEMA_ID, OUTPUT_SCHEMA_VERSION,
186    OUTPUT_V10_SCHEMA_ID, OUTPUT_V11_MAX_CHECKS_PER_FILE, OUTPUT_V11_MAX_FILES,
187    OUTPUT_V11_MAX_REPORT_BYTES, OutputContractError, RigInfo, RigInfoError, ToolInfo, ToolSource,
188    sha256_hex,
189};
190pub use dependency_closure::{
191    DEPENDENCY_CLOSURE_BUDGET_V1_ID, DEPENDENCY_CLOSURE_V1_ID,
192    DEPENDENCY_CLOSURE_V1_MAX_DEDUP_PROBES, DEPENDENCY_CLOSURE_V1_MAX_EXTERNAL_RESOURCES,
193    DEPENDENCY_CLOSURE_V1_MAX_KEY_BYTES, DEPENDENCY_CLOSURE_V1_MAX_NORMALIZATION_BYTES,
194    DEPENDENCY_CLOSURE_V1_MAX_PATH_COMPONENTS, DEPENDENCY_CLOSURE_V1_MAX_REFERENCES,
195    DEPENDENCY_CLOSURE_V1_MAX_RESOURCE_BYTES, DEPENDENCY_CLOSURE_V1_MAX_TOTAL_RESOURCE_BYTES,
196    DependencyClosureBuilderV1, DependencyClosureCoverageReasonV1, DependencyClosureCoverageV1,
197    DependencyClosureError, DependencyClosureIdentityV1, DependencyClosureReferenceV1,
198    DependencyClosureV1, DependencyClosureWorkV1, DependencyReferenceTargetV1,
199    DependencyResourceKeyV1, DependencyResourcePurposeV1, DependencyResourceRefusalReasonV1,
200    DependencyResourceUnavailableReasonV1, ExternalResourceIdentityV1, ResourceClosureBudgetV1,
201    ResourceKeySyntaxV1,
202};
203pub use directional_speed_evaluation::{
204    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_ID,
205    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_SCHEMA_VERSION,
206    CollectionDirectionalSpeedEvaluationControlError, CollectionDirectionalSpeedEvaluationV1,
207    CollectionDirectionalSpeedEvidenceMemberV1, CollectionDirectionalSpeedEvidenceV1,
208    CollectionDirectionalSpeedFindingV1, CollectionDirectionalSpeedLifecycleV1,
209    CollectionDirectionalSpeedNotEvaluatedReasonV1, evaluate_collection_directional_speed_v1,
210};
211pub use directional_speed_policy::{
212    COLLECTION_DIRECTIONAL_SPEED_EVIDENCE_V1_MAX_BYTES, COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_ID,
213    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_AXIS_COSINE,
214    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_BYTES,
215    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_COMPONENT,
216    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_DIRECTION_TOLERANCE_DEG,
217    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_MEMBERS,
218    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_SCALAR,
219    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_SCHEMA_VERSION,
220    CollectionDirectionalSpeedDiagonalBehaviorV1, CollectionDirectionalSpeedManifestIdentityV1,
221    CollectionDirectionalSpeedMemberV1, CollectionDirectionalSpeedModeV1,
222    CollectionDirectionalSpeedPolicyError, CollectionDirectionalSpeedPolicyV1,
223    CollectionDirectionalSpeedSourceBasisV1,
224};
225pub use engine_contract::{
226    ENGINE_CONTRACT_V1_MAX_AGGREGATE_ROWS, ENGINE_CONTRACT_V1_MAX_COLLECTION_ROWS,
227    ENGINE_CONTRACT_V1_MAX_TEXT_BYTES, ENGINE_CONTRACT_V1_MAX_TOTAL_TEXT_BYTES,
228    ENGINE_PROFILE_FACTS_V1_ID, EngineAnimationAddressabilityV1, EngineBakeOrExtractV1,
229    EngineClipSettingsV1, EngineContractError, EngineConversionControlV1, EngineCoordinateBasisV1,
230    EngineDefaultStatusV1, EngineFactIdV1, EngineFactStateV1, EngineFactValueV1,
231    EngineForwardAxisV1, EngineHandednessV1, EngineImportHandlingV1, EngineLinearUnitV1,
232    EnginePrimarySourceV1, EngineProfileFactV1, EngineProfileSelectionV1,
233    EngineRootMotionAddressabilityV1, EngineSettingApplicabilityV1, EngineSettingDescriptorV1,
234    EngineSettingDomainV1, EngineSettingIdV1, EngineSettingRowV1, EngineSettingScopeV1,
235    EngineSettingValueV1, EngineTargetAddressabilityV1, EngineUpAxisV1,
236    RESOLVED_ENGINE_SETTINGS_V1_ID, ResolvedEngineProfileV1, ResolvedEngineSettingsV1,
237};
238pub use evaluation::{
239    Applicability, BUILTIN_COVERAGE_GAP_CODES, BUILTIN_EVALUATION_SCOPE_CODES, CheckEvaluation,
240    CheckOutput, CheckSelection, ConfigurationState, CoverageGap, CoverageGapCode, EvaluationError,
241    EvaluationScope, EvaluationScopeCode, EvaluationState, SelectionState, evaluate_checks,
242    lint_requires_failure,
243};
244pub use finding::{Finding, MemberMeasurement, Severity, Value};
245/// Re-export of the exact `glam` version used by animsmith's public math
246/// types, so embedders can construct [`Transform`] values without a
247/// cross-version type mismatch.
248pub use glam;
249pub use metrics::MetricGrids;
250pub use model::{
251    AdditionalInfluenceSet, AffineDomainViolation, Bone, BoneId, Clip, DecodedImageColorType,
252    Document, DocumentShapeError, ImageContainerFormat, ImageSourceKind, ImageUnavailableReason,
253    Interpolation, MaterialResourceAssets, MaterialResourceCoverage, MaterialTextureSlot,
254    MeshInstanceShapeViolation, Property, Skeleton, SourceImageAsset, SourceImageInspection,
255    SourceInfo, SourceInverseBindAccessor, SourceInverseBindAccessorStatus, SourceMaterialAsset,
256    SourceMaterialTextureBinding, SourceNodeAsset, SourceNodeLocalRest, SourceProjectionViolation,
257    SourceSkeletonAssets, SourceSkeletonCoverage, SourceSkinAsset, SourceSkinAttachment,
258    SourceTextureAsset, Track, TrackShapeViolation, TrackValues, Transform,
259    validate_document_shape,
260};
261pub use prediction::{
262    ENGINE_PREDICTION_V1_ID, EnginePredictionBasisV1, EnginePredictionFacetStateV1,
263    EnginePredictionFacetV1, EnginePredictionV1, FinitePredictionNumberV1, MeasurementPointerV1,
264    PREDICTION_PROVENANCE_V1_ID, PREDICTION_V1_MAX_AGGREGATE_PROVENANCE_ROWS,
265    PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FACET, PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FILE,
266    PREDICTION_V1_MAX_FACETS_PER_FILE, PREDICTION_V1_MAX_MEASUREMENT_POINTER_COMPONENTS,
267    PREDICTION_V1_MAX_REASONS_PER_FACET, PREDICTION_V1_MAX_TEXT_BYTES,
268    PREDICTION_V1_MAX_TOTAL_TEXT_BYTES_PER_FILE, PredictionBasisIdentityV1,
269    PredictionBasisReferenceV1, PredictionContractError, PredictionProvenanceIdentityV1,
270    PredictionProvenanceV1, PredictionScalarV1, PredictionUnavailableReasonV1, RawSourceAxisV1,
271    RawSourceBasisReferenceV1, RawSourceBindingV1, RawSourceCoordinateBasisV1,
272    RawSourceDispositionV1, RawSourceDomainV1, RawSourceFieldIdV1, RawSourceKeyV1,
273    RawSourceObservationStateWireV1, RawSourceObservationWireV1, RawSourceProjectionWorkWireV1,
274    RawSourceProvenanceKindV1, RawSourceProvenanceV1, RawSourceSetCoverageStateV1,
275    RawSourceSetCoverageV1, RawSourceUnavailableReasonV1, ResolvedSettingLocationV1,
276    SourceSkeletonRowKindV1,
277};
278pub use profile::{
279    ResolutionOutcome, ResolvedRoles, RigProfile, Role, RoleResolutionPolicy, builtin_profiles,
280    detect_profile, detect_profile_detailed, resolve_configured_roles, resolve_named,
281    resolve_named_detailed,
282};
283pub use sample::{PoseGrid, TrackSample, default_frame_count, sample_clip, sample_track};
284pub use scale::{
285    ProofResidualKind, ScaleBoneRestField, ScaleCandidate, ScaleCapabilityCoverage,
286    ScaleCapabilityFacts, ScaleError, ScaleFieldDisposition, ScaleFieldPlan, ScaleFieldTarget,
287    ScaleOperation, ScalePayloadShapeRow, ScalePlan, ScalePlanLedger, ScaleProjectedRole,
288    ScaleProof, ScaleProofObligation, ScaleProofResidual, ScaleRequest, ScaleRewriteRule,
289    ScaleSourceNodeKind, ScaleSourceRestField, ScaleSourceTopologyRow, ScaleTolerancePolicy,
290    plan_scale, prove_scale,
291};
292pub use skinned_canonical::{
293    SkinnedBindPoseCanonicalization, SkinnedBindPoseCanonicalizationError,
294    SkinnedBindPoseCanonicalizationOptions, SkinnedBindPosePlacement,
295    canonicalize_skinned_bind_pose,
296};
297pub use source_facts::{
298    LoadedSource, RAW_SOURCE_FACTS_V1_ID, RAW_SOURCE_V1_MAX_CLIPS, RAW_SOURCE_V1_MAX_OBSERVATIONS,
299    RAW_SOURCE_V1_MAX_RESOURCE_REFERENCES, RAW_SOURCE_V1_MAX_TEXT_BYTES,
300    RAW_SOURCE_V1_MAX_TOTAL_TEXT_BYTES, RAW_SOURCE_V1_MAX_TRAVERSAL_DEPTH, RawSourceFactsBuilderV1,
301    RawSourceFactsV1, SourceAxisV1, SourceChannelFactV1, SourceChannelPropertyV1, SourceClipFactV1,
302    SourceComponentMaskV1, SourceConstructFactV1, SourceConstructKindV1, SourceCoordinateBasisV1,
303    SourceFactDomainV1, SourceFactSetV1, SourceFactsError, SourceFactsViewV1, SourceFormatV1,
304    SourceFramesPerSecondV1, SourceHandednessV1, SourceInterpolationV1, SourceLinearUnitV1,
305    SourceLoaderDispositionV1, SourceLogicalLocatorV1, SourceObservationStateV1,
306    SourceObservationV1, SourceProjectionWorkV1, SourceProvenanceKindV1, SourceProvenanceV1,
307    SourceRelativeLocatorV1, SourceResourceKindV1, SourceResourceLocatorV1,
308    SourceResourceReferenceV1, SourceSetCoverageStateV1, SourceSetCoverageV1, SourceTargetKindV1,
309    SourceTargetV1, SourceTextV1, SourceTimeRangeV1, SourceUnavailableReasonV1,
310};
311pub use stance_support::{
312    ResolvedStanceSupportV1, StanceSideV1, StanceSupportRunV1, resolve_stance_support_v1,
313};
314pub use static_bake::{
315    StaticMeshBake, StaticMeshBakeError, StaticMeshBakeEvidence, StaticMeshBakeInstanceEvidence,
316    bake_static_mesh_transforms,
317};
318pub use transition_family::{
319    CollectionTransitionFamilyMemberV1, CollectionTransitionFamilyV1,
320    DocumentTransitionFamilyMemberV1, DocumentTransitionFamilyV1, TRANSITION_FAMILY_V1_ID,
321    TRANSITION_FAMILY_V1_MAX_AGGREGATE_MEMBERS, TRANSITION_FAMILY_V1_MAX_DEPTH,
322    TRANSITION_FAMILY_V1_MAX_DOCUMENT_FAMILY_ID_BYTES, TRANSITION_FAMILY_V1_MAX_FAMILIES,
323    TRANSITION_FAMILY_V1_MAX_MEMBERS_PER_FAMILY, TRANSITION_FAMILY_V1_MAX_NORMALIZED_BYTES,
324    TRANSITION_FAMILY_V1_MAX_SOURCE_BYTES, TRANSITION_FAMILY_V1_MAX_STRING_BYTES,
325    TRANSITION_FAMILY_V1_SCHEMA_VERSION, TransitionFamilyBasisV1, TransitionFamilyBoundaryV1,
326    TransitionFamilyDeclarationInputV1, TransitionFamilyDeclarationV1, TransitionFamilyError,
327    TransitionFamilyManifestIdentityV1, TransitionFamilyTolerancesV1,
328};
329pub use transition_pose_evaluation::{
330    CollectionTransitionPoseMemberInputV1, SkeletonBasisBoneV1, SkeletonBasisError,
331    SkeletonBasisV1, TRANSITION_POSE_EVALUATION_V1_ID,
332    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_COMPARISONS,
333    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_OFFENDERS,
334    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_PAIR_BOUNDARIES,
335    TRANSITION_POSE_EVALUATION_V1_MAX_BASIS_TEXT_BYTES, TRANSITION_POSE_EVALUATION_V1_MAX_BONES,
336    TRANSITION_POSE_EVALUATION_V1_MAX_DOCUMENT_CLIPS,
337    TRANSITION_POSE_EVALUATION_V1_MAX_FAMILY_PAIR_BOUNDARIES,
338    TRANSITION_POSE_EVALUATION_V1_MAX_RAW_TRACK_ROWS_PER_CLIP,
339    TRANSITION_POSE_EVALUATION_V1_MAX_RESULT_BYTES,
340    TRANSITION_POSE_EVALUATION_V1_MAX_ROTATION_OFFENDERS,
341    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACK_ELEMENTS,
342    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACKS_PER_CLIP,
343    TRANSITION_POSE_EVALUATION_V1_MAX_TRANSLATION_OFFENDERS,
344    TRANSITION_POSE_EVALUATION_V1_SCHEMA_VERSION, TransitionPoseDecisionV1,
345    TransitionPoseEvaluationControlError, TransitionPoseEvaluationV1,
346    TransitionPoseFamilyEvaluationV1, TransitionPoseMemberV1, TransitionPosePairEvaluationV1,
347    TransitionPoseReasonV1, TransitionPoseRotationOffenderV1, TransitionPoseStatusV1,
348    TransitionPoseTranslationOffenderV1, evaluate_collection_transition_poses_v1,
349    evaluate_document_transition_poses_v1,
350};