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