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