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 V3 +X/+Z endpoint
50//! displacement. Basis magnitudes are nonsemantic; 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 raw_animation_inventory;
144pub mod raw_gltf_addressability;
145pub mod raw_scene_inventory;
146pub mod raw_transform_path_inventory;
147pub mod sample;
148pub mod scale;
149pub mod skinned_canonical;
150pub mod source_facts;
151pub mod source_timing;
152pub mod stance_support;
153pub mod static_bake;
154pub mod transform;
155pub mod transition_family;
156/// Strict core-only transition-pose evaluation and skeleton-basis identity.
157pub mod transition_pose_evaluation;
158
159pub use check::{Check, CheckCtx, all_checks, mechanical_checks};
160pub use collection::{
161    COLLECTION_MANIFEST_V1_BUDGET_ID, COLLECTION_MANIFEST_V1_ID,
162    COLLECTION_MANIFEST_V1_MAX_AGGREGATE_MEMBERS, COLLECTION_MANIFEST_V1_MAX_AGGREGATE_WORK,
163    COLLECTION_MANIFEST_V1_MAX_CLIPS, COLLECTION_MANIFEST_V1_MAX_IDENTIFIER_BYTES,
164    COLLECTION_MANIFEST_V1_MAX_MANIFEST_BYTES, COLLECTION_MANIFEST_V1_MAX_RUNTIME_SETS,
165    COLLECTION_MANIFEST_V1_MAX_SOURCES, COLLECTION_MANIFEST_V1_MAX_TAKE_NAME_BYTES,
166    COLLECTION_MANIFEST_V1_SCHEMA_VERSION, CollectionClipV1, CollectionDigestPinV1, CollectionIdV1,
167    CollectionLogicalIdV1, CollectionManifestBudgetV1, CollectionManifestError,
168    CollectionManifestV1, CollectionRuntimeSetKindV1, CollectionRuntimeSetV1,
169    CollectionSourceKeyV1, CollectionSourceV1,
170};
171pub use config::{
172    ClipExpectations, Config, ConfigValidationError, GaitGroup, MovementOwner, Pinned,
173    RuntimeNodeSelectorResolution, RuntimeNodeSelectors, RuntimeNodesConfig, SeveritySetting,
174    SyncGroup, TimeComplementSettings,
175};
176pub use contact_fragment::{
177    CONTACT_FRAGMENT_V1_ID, CONTACT_FRAGMENT_V1_MAX_CANONICAL_BYTES, CONTACT_FRAGMENT_V1_MAX_DEPTH,
178    CONTACT_FRAGMENT_V1_MAX_EVENTS, CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_BYTES,
179    CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_DEPTH, CONTACT_FRAGMENT_V1_MAX_EXTENSIONS,
180    CONTACT_FRAGMENT_V1_MAX_IDENTIFIER_BYTES, CONTACT_FRAGMENT_V1_MAX_SAFE_INTEGER,
181    CONTACT_FRAGMENT_V1_MAX_SOURCE_BYTES, CONTACT_FRAGMENT_V1_MAX_TEXT_BYTES,
182    CONTACT_FRAGMENT_V1_SCHEMA_VERSION, ContactClipReferenceV1, ContactEventKindV1, ContactEventV1,
183    ContactEventWindowV1, ContactExtensionV1, ContactFragmentError, ContactFragmentV1,
184    ContactPhaseV1, ContactProducerV1, ContactRoleV1,
185};
186pub use contract::{
187    DiffEnvelope, InputIdentity, LintEnvelope, LintEnvelopeV16, LintEnvelopeV17, LintFileReport,
188    LintFileReportV16, LintFileReportV17, MEASUREMENTS_SCHEMA_ID, MEASUREMENTS_SCHEMA_VERSION,
189    MEASUREMENTS_V15_SCHEMA_ID, MEASUREMENTS_V15_SCHEMA_VERSION, MeasureEnvelope,
190    MeasureFileReport, MeasurementContract, MeasurementContractError, MeasurementFileError,
191    MeasurementReportError, MeasurementReportFile, MeasurementReportInput,
192    MeasurementReportReadError, OUTPUT_SCHEMA_ID, OUTPUT_SCHEMA_VERSION, OUTPUT_V10_SCHEMA_ID,
193    OUTPUT_V11_MAX_CHECKS_PER_FILE, OUTPUT_V11_MAX_FILES, OUTPUT_V11_MAX_REPORT_BYTES,
194    OUTPUT_V11_SCHEMA_ID, OUTPUT_V11_SCHEMA_VERSION, OUTPUT_V12_SCHEMA_ID,
195    OUTPUT_V12_SCHEMA_VERSION, OUTPUT_V13_SCHEMA_ID, OUTPUT_V13_SCHEMA_VERSION,
196    OUTPUT_V14_SCHEMA_ID, OUTPUT_V14_SCHEMA_VERSION, OUTPUT_V15_SCHEMA_ID,
197    OUTPUT_V15_SCHEMA_VERSION, OUTPUT_V16_SCHEMA_ID, OUTPUT_V16_SCHEMA_VERSION,
198    OutputContractError, RigInfo, RigInfoError, ToolInfo, ToolSource, sha256_hex,
199};
200pub use dependency_closure::{
201    DEPENDENCY_CLOSURE_BUDGET_V1_ID, DEPENDENCY_CLOSURE_V1_ID,
202    DEPENDENCY_CLOSURE_V1_MAX_DEDUP_PROBES, DEPENDENCY_CLOSURE_V1_MAX_EXTERNAL_RESOURCES,
203    DEPENDENCY_CLOSURE_V1_MAX_KEY_BYTES, DEPENDENCY_CLOSURE_V1_MAX_NORMALIZATION_BYTES,
204    DEPENDENCY_CLOSURE_V1_MAX_PATH_COMPONENTS, DEPENDENCY_CLOSURE_V1_MAX_REFERENCES,
205    DEPENDENCY_CLOSURE_V1_MAX_RESOURCE_BYTES, DEPENDENCY_CLOSURE_V1_MAX_TOTAL_RESOURCE_BYTES,
206    DependencyClosureBuilderV1, DependencyClosureCoverageReasonV1, DependencyClosureCoverageV1,
207    DependencyClosureError, DependencyClosureIdentityV1, DependencyClosureReferenceV1,
208    DependencyClosureV1, DependencyClosureWorkV1, DependencyReferenceTargetV1,
209    DependencyResourceKeyV1, DependencyResourcePurposeV1, DependencyResourceRefusalReasonV1,
210    DependencyResourceUnavailableReasonV1, ExternalResourceIdentityV1, ResourceClosureBudgetV1,
211    ResourceKeySyntaxV1,
212};
213pub use directional_speed_evaluation::{
214    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_ID,
215    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_SCHEMA_VERSION,
216    CollectionDirectionalSpeedEvaluationControlError, CollectionDirectionalSpeedEvaluationV1,
217    CollectionDirectionalSpeedEvidenceMemberV1, CollectionDirectionalSpeedEvidenceV1,
218    CollectionDirectionalSpeedFindingV1, CollectionDirectionalSpeedLifecycleV1,
219    CollectionDirectionalSpeedNotEvaluatedReasonV1, evaluate_collection_directional_speed_v1,
220};
221pub use directional_speed_policy::{
222    COLLECTION_DIRECTIONAL_SPEED_EVIDENCE_V1_MAX_BYTES, COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_ID,
223    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_AXIS_COSINE,
224    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_BYTES,
225    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_COMPONENT,
226    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_DIRECTION_TOLERANCE_DEG,
227    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_MEMBERS,
228    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_SCALAR,
229    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_SCHEMA_VERSION,
230    CollectionDirectionalSpeedDiagonalBehaviorV1, CollectionDirectionalSpeedManifestIdentityV1,
231    CollectionDirectionalSpeedMemberV1, CollectionDirectionalSpeedModeV1,
232    CollectionDirectionalSpeedPolicyError, CollectionDirectionalSpeedPolicyV1,
233    CollectionDirectionalSpeedSourceBasisV1,
234};
235pub use engine_contract::{
236    ENGINE_CONTRACT_V1_MAX_AGGREGATE_ROWS, ENGINE_CONTRACT_V1_MAX_COLLECTION_ROWS,
237    ENGINE_CONTRACT_V1_MAX_TEXT_BYTES, ENGINE_CONTRACT_V1_MAX_TOTAL_TEXT_BYTES,
238    ENGINE_PROFILE_FACTS_V1_ID, ENGINE_PROFILE_FACTS_V2_ID, EngineAnimationAddressabilityV1,
239    EngineBakeOrExtractV1, EngineClipSettingsV1, EngineClipSettingsV3, EngineContractError,
240    EngineConversionControlV1, EngineCoordinateBasisV1, EngineDefaultStatusV1, EngineFactIdV1,
241    EngineFactIdV2, EngineFactStateV1, EngineFactStateV2, EngineFactValueV1, EngineFactValueV2,
242    EngineForwardAxisV1, EngineHandednessV1, EngineImportHandlingV1, EngineLinearUnitV1,
243    EngineLinearUnitV2, EnginePrimarySourceV1, EnginePrimarySourceV2, EngineProfileFactV1,
244    EngineProfileFactV2, EngineProfileSelectionV1, EngineRootMotionAddressabilityV1,
245    EngineSampleRateV2, EngineSettingApplicabilityV1, EngineSettingDescriptorV1,
246    EngineSettingDescriptorV2, EngineSettingDomainV1, EngineSettingDomainV2, EngineSettingIdV1,
247    EngineSettingIdV2, EngineSettingRowV1, EngineSettingRowV3, EngineSettingScopeV1,
248    EngineSettingValueOriginV3, EngineSettingValueV1, EngineSettingValueV2,
249    EngineTargetAddressabilityV1, EngineUpAxisV1, RESOLVED_ENGINE_SETTINGS_V1_ID,
250    RESOLVED_ENGINE_SETTINGS_V2_ID, RESOLVED_ENGINE_SETTINGS_V3_ID, ReducedRatioV1,
251    ResolvedEngineProfileV1, ResolvedEngineProfileV2, ResolvedEngineSettingsCoverageReasonV2,
252    ResolvedEngineSettingsCoverageStateV2, ResolvedEngineSettingsCoverageV2,
253    ResolvedEngineSettingsV1, ResolvedEngineSettingsV2, ResolvedEngineSettingsV3,
254    ResolvedEngineSettingsWorkV2,
255};
256pub use evaluation::{
257    Applicability, BUILTIN_COVERAGE_GAP_CODES, BUILTIN_EVALUATION_SCOPE_CODES, CheckEvaluation,
258    CheckOutput, CheckSelection, ConfigurationState, CoverageGap, CoverageGapCode, EvaluationError,
259    EvaluationScope, EvaluationScopeCode, EvaluationState, SelectionState, evaluate_checks,
260    evaluate_checks_v2, lint_requires_failure,
261};
262pub use finding::{Finding, MemberMeasurement, Severity, Value};
263/// Re-export of the exact `glam` version used by animsmith's public math
264/// types, so embedders can construct [`Transform`] values without a
265/// cross-version type mismatch.
266pub use glam;
267pub use metrics::MetricGrids;
268pub use model::{
269    AdditionalInfluenceSet, AffineDomainViolation, Bone, BoneId, Clip, DecodedImageColorType,
270    Document, DocumentShapeError, ImageContainerFormat, ImageSourceKind, ImageUnavailableReason,
271    Interpolation, MaterialResourceAssets, MaterialResourceCoverage, MaterialTextureSlot,
272    MeshInstanceShapeViolation, Property, Skeleton, SourceImageAsset, SourceImageInspection,
273    SourceInfo, SourceInverseBindAccessor, SourceInverseBindAccessorStatus, SourceMaterialAsset,
274    SourceMaterialTextureBinding, SourceNodeAsset, SourceNodeLocalRest, SourceProjectionViolation,
275    SourceSkeletonAssets, SourceSkeletonCoverage, SourceSkinAsset, SourceSkinAttachment,
276    SourceTextureAsset, Track, TrackShapeViolation, TrackValues, Transform,
277    validate_document_shape,
278};
279pub use prediction::{
280    ApplicationWorldUnitPolicyV1, ENGINE_PREDICTION_V1_ID, ENGINE_PREDICTION_V2_ID,
281    ENGINE_PREDICTION_V3_ID, ENGINE_PREDICTION_V4_ID, ENGINE_PREDICTION_V5_ID,
282    ENGINE_PREDICTION_V6_ID, ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_ID,
283    ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_MAX_CLIPS, EngineMachineResultV1, EnginePredictionBasisV1,
284    EnginePredictionBasisV2, EnginePredictionBasisV4, EnginePredictionFacetStateV1,
285    EnginePredictionFacetV1, EnginePredictionFacetV2, EnginePredictionFacetV3,
286    EnginePredictionFacetV4, EnginePredictionV1, EnginePredictionV2, EnginePredictionV3,
287    EnginePredictionV4, EnginePredictionV5, EnginePredictionV6, EngineRootMotionClipIntentInputV1,
288    EngineRootMotionClipIntentV1, EngineRootMotionClipMappingStateV1,
289    EngineRootMotionProjectIntentCountV1, EngineRootMotionProjectIntentCoverageV1,
290    EngineRootMotionProjectIntentV1, ExactSourceClipTimeRangeWireV1,
291    ExactSourceClipTimingBindingV1, ExactSourceFramePeriodWireV1, ExactSourceRangeSelectionWireV1,
292    ExactSourceTimeBasisWireV1, ExactSourceTimeDisplayProtocolWireV1,
293    ExactSourceTimelineModeWireV1, ExactSourceTimingBasisReferenceV1, ExactSourceTimingBindingV1,
294    ExactSourceTimingDomainV1, ExactSourceTimingKeyV1, ExactSourceTimingObservationStateWireV1,
295    ExactSourceTimingObservationWireV1, ExactSourceTimingUnavailableReasonWireV1,
296    FinitePredictionNumberV1, ImportSettingProjectionFieldV1, ImportSettingProjectionKindV1,
297    ImportSettingProjectionResultV1, ImporterScaleConversionV1, ImporterSubjectCreationV1,
298    InventoryCoverageResultV1, MeasurementPointerV1, PREDICTION_PROVENANCE_V1_ID,
299    PREDICTION_PROVENANCE_V2_ID, PREDICTION_PROVENANCE_V3_ID, PREDICTION_PROVENANCE_V4_ID,
300    PREDICTION_PROVENANCE_V5_ID, PREDICTION_PROVENANCE_V6_ID, PREDICTION_RULE_INPUTS_V1_ID,
301    PREDICTION_V1_MAX_AGGREGATE_PROVENANCE_ROWS, PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FACET,
302    PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FILE, PREDICTION_V1_MAX_FACETS_PER_FILE,
303    PREDICTION_V1_MAX_MEASUREMENT_POINTER_COMPONENTS, PREDICTION_V1_MAX_REASONS_PER_FACET,
304    PREDICTION_V1_MAX_TEXT_BYTES, PREDICTION_V1_MAX_TOTAL_TEXT_BYTES_PER_FILE,
305    PREDICTION_V2_MAX_CANDIDATE_FACETS_PER_RULE, ParserFrameRateProjectionWireV1,
306    PredictionBasisIdentityV1, PredictionBasisIdentityV2, PredictionBasisIdentityV4,
307    PredictionBasisReferenceV1, PredictionBasisReferenceV2, PredictionBasisReferenceV4,
308    PredictionContractError, PredictionFacetDemandV2, PredictionInventoryCoverageStateV1,
309    PredictionInventoryDomainV1, PredictionProvenanceIdentityV1, PredictionProvenanceIdentityV2,
310    PredictionProvenanceIdentityV3, PredictionProvenanceIdentityV4, PredictionProvenanceIdentityV5,
311    PredictionProvenanceIdentityV6, PredictionProvenanceV1, PredictionProvenanceV2,
312    PredictionProvenanceV3, PredictionProvenanceV4, PredictionProvenanceV5, PredictionProvenanceV6,
313    PredictionRuleAllocationV2, PredictionRuleDemandV2, PredictionRuleInputsV1, PredictionScalarV1,
314    PredictionUnavailableReasonV1, PredictionUnavailableReasonV2, PredictionUnitV1,
315    RAW_SOURCE_FACTS_V2_ID, RawSceneAttachmentBasisDomainV1, RawSceneAttachmentBasisReferenceV1,
316    RawSceneAttachmentBindingV1, RawSceneAttachmentUnavailableReasonV1, RawSourceAxisV1,
317    RawSourceBasisReferenceV1, RawSourceBindingV1, RawSourceBindingV2, RawSourceCoordinateBasisV1,
318    RawSourceDispositionV1, RawSourceDomainV1, RawSourceFieldIdV1, RawSourceKeyV1,
319    RawSourceObservationStateWireV1, RawSourceObservationWireV1, RawSourceProjectionWorkWireV1,
320    RawSourceProvenanceKindV1, RawSourceProvenanceV1, RawSourceSetCoverageStateV1,
321    RawSourceSetCoverageV1, RawSourceUnavailableReasonV1, ResolvedSettingLocationV1,
322    RootMotionAxisV1, RootMotionCompatibilityV1, RootMotionImporterDispositionV1,
323    RootMotionProjectOwnerV1, RootMotionRoutingResultV1, SourceImportDispositionResultV1,
324    SourceImportDispositionV1, SourceImportSubjectKindV1, SourceNumericDimensionsV1,
325    SourceSkeletonRowKindV1, TransformScaleDomainV1, TransformScaleResultV1,
326    TransformScaleSubjectKindV1, UnitMappingResultV1, allocate_prediction_facets_v2,
327};
328pub use profile::{
329    ResolutionOutcome, ResolvedRoles, RigProfile, Role, RoleResolutionPolicy, builtin_profiles,
330    detect_profile, detect_profile_detailed, resolve_configured_roles, resolve_named,
331    resolve_named_detailed,
332};
333pub use raw_animation_inventory::{
334    RAW_ANIMATION_CHANNEL_INVENTORY_V1_ID, RAW_ANIMATION_CHANNEL_INVENTORY_V1_MAX_CANDIDATES,
335    RawAnimationChannelInventoryV1, RawAnimationChannelRowV1,
336};
337pub use raw_gltf_addressability::{
338    RAW_GLTF_ADDRESSABILITY_INVENTORY_V1_ID, RAW_GLTF_ADDRESSABILITY_V1_MAX_NAME_BYTES,
339    RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_SEGMENTS,
340    RAW_GLTF_ADDRESSABILITY_V1_MAX_READER_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_ROWS_PER_DOMAIN,
341    RAW_GLTF_ADDRESSABILITY_V1_MAX_STRUCTURAL_REFERENCES,
342    RAW_GLTF_ADDRESSABILITY_V1_MAX_TEXT_BYTES, RawGltfAddressabilityCoverageReasonV1,
343    RawGltfAddressabilityCoverageV1, RawGltfAddressabilityInventoryErrorV1,
344    RawGltfAddressabilityInventoryInputV1, RawGltfAddressabilityInventoryReadErrorV1,
345    RawGltfAddressabilityInventoryV1, RawGltfDefaultSceneObservationV1,
346    RawGltfInverseBindMatricesObservationV1, RawGltfNodeRowV1, RawGltfScenePathCandidateRowV1,
347    RawGltfSceneRowV1, RawGltfSkinAttachmentRowV1, RawGltfSkinRowV1,
348};
349pub use raw_scene_inventory::{
350    RAW_SCENE_ATTACHMENT_INVENTORY_V1_ID, RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_ROWS,
351    RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_TEXT_BYTES, RawMeshPrimitiveRowV1,
352    RawMeshPrimitiveRowsV1, RawNodeMeshAttachmentRowV1, RawNodeMeshAttachmentRowsV1,
353    RawPrimitiveTopologyV1, RawSceneAttachmentCoverageV1, RawSceneAttachmentInventoryError,
354    RawSceneAttachmentInventoryV1, RawSceneRootRowV1, RawSceneRootRowsV1,
355    RawSourceSkeletonEvidenceV1,
356};
357pub use raw_transform_path_inventory::{
358    RAW_TRANSFORM_PATH_INVENTORY_V1_ID, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_PARENT_REFERENCES,
359    RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_ROWS, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_TEXT_BYTES,
360    RAW_TRANSFORM_PATH_V1_MAX_DEPTH, RAW_TRANSFORM_PATH_V1_MAX_PATH_BYTES,
361    RAW_TRANSFORM_PATH_V1_MAX_SEGMENT_BYTES, RawTransformPathCoverageReasonV1,
362    RawTransformPathCoverageV1, RawTransformPathInventoryErrorV1, RawTransformPathInventoryV1,
363    RawTransformPathMatchV1, RawTransformPathNodeInputV1, RawTransformPathNodeKindV1,
364    RawTransformPathNodeRowV1, RawTransformPathResolutionV1, RawTransformPathRowAddressabilityV1,
365    RawTransformPathSyntaxErrorV1, RawTransformPathV1,
366};
367pub use sample::{PoseGrid, TrackSample, default_frame_count, sample_clip, sample_track};
368pub use scale::{
369    ProofResidualKind, ScaleBoneRestField, ScaleCandidate, ScaleCapabilityCoverage,
370    ScaleCapabilityFacts, ScaleError, ScaleFieldDisposition, ScaleFieldPlan, ScaleFieldTarget,
371    ScaleOperation, ScalePayloadShapeRow, ScalePlan, ScalePlanLedger, ScaleProjectedRole,
372    ScaleProof, ScaleProofObligation, ScaleProofResidual, ScaleRequest, ScaleRewriteRule,
373    ScaleSourceNodeKind, ScaleSourceRestField, ScaleSourceTopologyRow, ScaleTolerancePolicy,
374    plan_scale, prove_scale,
375};
376pub use skinned_canonical::{
377    SkinnedBindPoseCanonicalization, SkinnedBindPoseCanonicalizationError,
378    SkinnedBindPoseCanonicalizationOptions, SkinnedBindPosePlacement,
379    canonicalize_skinned_bind_pose,
380};
381pub use source_facts::{
382    LoadedSource, RAW_SOURCE_FACTS_V1_ID, RAW_SOURCE_V1_MAX_CLIPS, RAW_SOURCE_V1_MAX_OBSERVATIONS,
383    RAW_SOURCE_V1_MAX_RESOURCE_REFERENCES, RAW_SOURCE_V1_MAX_TEXT_BYTES,
384    RAW_SOURCE_V1_MAX_TOTAL_TEXT_BYTES, RAW_SOURCE_V1_MAX_TRAVERSAL_DEPTH,
385    RawGltfAddressabilityBindingErrorV1, RawSceneAttachmentBindingError, RawSourceFactsBuilderV1,
386    RawSourceFactsV1, RawTransformPathBindingError, SourceAxisV1, SourceChannelFactV1,
387    SourceChannelPropertyV1, SourceClipFactV1, SourceComponentMaskV1, SourceConstructFactV1,
388    SourceConstructKindV1, SourceCoordinateBasisV1, SourceFactDomainV1, SourceFactSetV1,
389    SourceFactsError, SourceFactsViewV1, SourceFormatV1, SourceFramesPerSecondV1,
390    SourceHandednessV1, SourceInterpolationV1, SourceLinearUnitV1, SourceLoaderDispositionV1,
391    SourceLogicalLocatorV1, SourceObservationStateV1, SourceObservationV1, SourceProjectionWorkV1,
392    SourceProvenanceKindV1, SourceProvenanceV1, SourceRelativeLocatorV1, SourceResourceKindV1,
393    SourceResourceLocatorV1, SourceResourceReferenceV1, SourceSetCoverageStateV1,
394    SourceSetCoverageV1, SourceTargetKindV1, SourceTargetV1, SourceTextV1, SourceTimeRangeV1,
395    SourceUnavailableReasonV1,
396};
397pub use source_timing::{
398    EXACT_SOURCE_TIMING_V1_ID, EXACT_SOURCE_TIMING_V1_MAX_CLIPS, ExactSourceClipTimeRangeV1,
399    ExactSourceClipTimingV1, ExactSourceFramePeriodV1, ExactSourceRangeSelectionV1,
400    ExactSourceTimeBasisV1, ExactSourceTimingContractError, ExactSourceTimingObservationStateV1,
401    ExactSourceTimingObservationV1, ExactSourceTimingUnavailableReasonV1, ExactSourceTimingV1,
402    ParserFrameRateProjectionV1, SourceTimeDisplayProtocolV1, SourceTimelineModeV1,
403};
404pub use stance_support::{
405    ResolvedStanceSupportV1, StanceSideV1, StanceSupportRunV1, resolve_stance_support_v1,
406};
407pub use static_bake::{
408    StaticMeshBake, StaticMeshBakeError, StaticMeshBakeEvidence, StaticMeshBakeInstanceEvidence,
409    bake_static_mesh_transforms,
410};
411pub use transition_family::{
412    CollectionTransitionFamilyMemberV1, CollectionTransitionFamilyV1,
413    DocumentTransitionFamilyMemberV1, DocumentTransitionFamilyV1, TRANSITION_FAMILY_V1_ID,
414    TRANSITION_FAMILY_V1_MAX_AGGREGATE_MEMBERS, TRANSITION_FAMILY_V1_MAX_DEPTH,
415    TRANSITION_FAMILY_V1_MAX_DOCUMENT_FAMILY_ID_BYTES, TRANSITION_FAMILY_V1_MAX_FAMILIES,
416    TRANSITION_FAMILY_V1_MAX_MEMBERS_PER_FAMILY, TRANSITION_FAMILY_V1_MAX_NORMALIZED_BYTES,
417    TRANSITION_FAMILY_V1_MAX_SOURCE_BYTES, TRANSITION_FAMILY_V1_MAX_STRING_BYTES,
418    TRANSITION_FAMILY_V1_SCHEMA_VERSION, TransitionFamilyBasisV1, TransitionFamilyBoundaryV1,
419    TransitionFamilyDeclarationInputV1, TransitionFamilyDeclarationV1, TransitionFamilyError,
420    TransitionFamilyManifestIdentityV1, TransitionFamilyTolerancesV1,
421};
422pub use transition_pose_evaluation::{
423    CollectionTransitionPoseMemberInputV1, SkeletonBasisBoneV1, SkeletonBasisError,
424    SkeletonBasisV1, TRANSITION_POSE_EVALUATION_V1_ID,
425    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_COMPARISONS,
426    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_OFFENDERS,
427    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_PAIR_BOUNDARIES,
428    TRANSITION_POSE_EVALUATION_V1_MAX_BASIS_TEXT_BYTES, TRANSITION_POSE_EVALUATION_V1_MAX_BONES,
429    TRANSITION_POSE_EVALUATION_V1_MAX_DOCUMENT_CLIPS,
430    TRANSITION_POSE_EVALUATION_V1_MAX_FAMILY_PAIR_BOUNDARIES,
431    TRANSITION_POSE_EVALUATION_V1_MAX_RAW_TRACK_ROWS_PER_CLIP,
432    TRANSITION_POSE_EVALUATION_V1_MAX_RESULT_BYTES,
433    TRANSITION_POSE_EVALUATION_V1_MAX_ROTATION_OFFENDERS,
434    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACK_ELEMENTS,
435    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACKS_PER_CLIP,
436    TRANSITION_POSE_EVALUATION_V1_MAX_TRANSLATION_OFFENDERS,
437    TRANSITION_POSE_EVALUATION_V1_SCHEMA_VERSION, TransitionPoseDecisionV1,
438    TransitionPoseEvaluationControlError, TransitionPoseEvaluationV1,
439    TransitionPoseFamilyEvaluationV1, TransitionPoseMemberV1, TransitionPosePairEvaluationV1,
440    TransitionPoseReasonV1, TransitionPoseRotationOffenderV1, TransitionPoseStatusV1,
441    TransitionPoseTranslationOffenderV1, evaluate_collection_transition_poses_v1,
442    evaluate_document_transition_poses_v1,
443};