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 [`foot_cycle`] module owns the strict manifest/contact bindings and
40//! pure slope-bounded piecewise-linear map planner for a declared gait ring.
41//! It produces contact-transform V1 operation inputs. The separate
42//! [`foot_cycle_clip`] module can apply one validated member plan to a cloned
43//! format-neutral clip candidate; source binding, serialization, output proof,
44//! and filesystem publication remain frontend work.
45//! The [`animsmith-gltf`] and [`animsmith-fbx`] loader crates translate file
46//! formats into this model; their docs.rs pages continue the library path for
47//! format-specific loading and, for glTF, writing.
48//!
49//! The [embedding guide] explains crate selection and integration
50//! boundaries. The [pipeline scenario guide] shows where an embedded gate
51//! fits in marketplace intake, mocap cleanup, outsourced acceptance, and CI.
52//! A [runnable example] exercises the complete library flow.
53//!
54//! The directional-speed policy V1 API freezes source-basis vectors as
55//! orientation witnesses for raw collection-output V3 +X/+Z endpoint
56//! displacement. Basis magnitudes are nonsemantic; evaluation uses
57//! unit axes for heading and the raw evidence identity for binding.
58//!
59//! [embedding guide]: https://github.com/mmannerm/animsmith/blob/main/docs/embedding.md
60//! [pipeline scenario guide]: https://github.com/mmannerm/animsmith/blob/main/docs/pipeline-scenarios.md
61//! [runnable example]: https://github.com/mmannerm/animsmith/blob/main/crates/animsmith/examples/embed.rs
62//! [`animsmith-gltf`]: https://docs.rs/animsmith-gltf
63//! [`animsmith-fbx`]: https://docs.rs/animsmith-fbx
64//!
65//! # Quick start
66//!
67//! After a format crate has loaded a [`Document`], resolve rig roles, build
68//! a [`Config`] from the host pipeline's contract, and share one
69//! [`MetricGrids`] between measurements, checks, and optional report
70//! generation:
71//!
72//! ```
73//! use animsmith_core::{
74//!     CheckCtx, CheckSelection, Config, Document, MetricGrids, all_checks,
75//!     evaluate_checks, resolve_configured_roles,
76//! };
77//! use animsmith_core::measure::measure_document;
78//!
79//! let doc = Document::default();
80//! let config = Config::default();
81//! config.validate()?;
82//! let roles = resolve_configured_roles(&doc.skeleton, &config.rig);
83//! let grids = MetricGrids::new(&doc);
84//!
85//! let measurements = measure_document(&grids, &roles, &config);
86//! let ctx = CheckCtx::new(&grids, &roles, &config);
87//! let results = evaluate_checks(&ctx, &all_checks(), CheckSelection::All)?;
88//!
89//! assert!(measurements.is_empty());
90//! assert!(results.iter().all(|result| result.findings().is_empty()));
91//! # Ok::<(), animsmith_core::EvaluationError>(())
92//! ```
93//!
94//! [`CheckCtx::new`] consumes already-resolved roles; it does not interpret
95//! [`Config::rig`] automatically. Frontends may use [`detect_profile`],
96//! [`resolve_configured_roles`] for the same named-profile plus inline-override
97//! policy as the CLI. Missing prerequisites are represented as typed coverage
98//! gaps rather than false findings.
99//!
100//! # API status
101//!
102//! The Rust API is pre-1.0 and may still change before the first stable
103//! release. The intended extension points are the data model,
104//! configuration types, measurement and diff APIs, rig-profile APIs, the
105//! [`Check`] trait for custom checks, and the check catalog functions
106//! re-exported from this crate root. Built-in check ids, CLI exit-code
107//! semantics, and the shared versioned JSON envelope/schema ids are treated
108//! as the most stable automation contracts. The [`contract`] module owns the
109//! same envelope types and immutable identities for CLI and embedded
110//! producers. The scene-asset
111//! structs in [`model`] and the pipeline-mechanical helpers in
112//! [`transform`] and [`static_bake`] are public so the loader, writer, and CLI crates can
113//! share the same model, but they are less settled than the
114//! measurement/check embedding flow while the crate is pre-1.0. Metric
115//! formulas and individual Rust symbols are still subject to pre-1.0
116//! refinement.
117//!
118//! Public APIs that return [`Result`] document their `# Errors` cases.
119//! Index-based accessors and transform helpers that rely on
120//! loader-established invariants document their `# Panics` contracts.
121//! Loader-valid documents from the format crates should flow through
122//! checking, sampling, and measurement without panicking on untrusted
123//! input.
124
125#![warn(missing_docs)]
126
127pub mod assembly;
128mod bounded_deserialize;
129pub mod check;
130mod checks;
131pub mod collection;
132pub mod config;
133pub mod contact_fragment;
134pub mod contact_transform;
135pub mod contract;
136pub mod dependency_closure;
137pub mod diff;
138pub mod directional_speed_evaluation;
139pub mod directional_speed_policy;
140pub mod engine_contract;
141pub mod evaluation;
142pub mod finding;
143#[cfg(feature = "fixtures")]
144pub mod fixtures;
145pub mod foot_cycle;
146pub mod foot_cycle_clip;
147pub mod measure;
148pub mod metrics;
149pub mod model;
150pub mod prediction;
151pub mod profile;
152pub mod raw_animation_inventory;
153pub mod raw_gltf_addressability;
154pub mod raw_scene_inventory;
155pub mod raw_transform_path_inventory;
156pub mod sample;
157pub mod scale;
158pub mod skinned_canonical;
159pub mod source_facts;
160pub mod source_timing;
161pub mod stance_support;
162pub mod static_bake;
163pub mod transform;
164pub mod transition_family;
165/// Strict core-only transition-pose evaluation and skeleton-basis identity.
166pub mod transition_pose_evaluation;
167
168pub use check::{Check, CheckCtx, all_checks, mechanical_checks};
169pub use checks::foot_slide::DEFAULT_CONTACT_HEIGHT_M;
170pub use collection::{
171    COLLECTION_MANIFEST_V1_BUDGET_ID, COLLECTION_MANIFEST_V1_ID,
172    COLLECTION_MANIFEST_V1_MAX_AGGREGATE_MEMBERS, COLLECTION_MANIFEST_V1_MAX_AGGREGATE_WORK,
173    COLLECTION_MANIFEST_V1_MAX_CLIPS, COLLECTION_MANIFEST_V1_MAX_IDENTIFIER_BYTES,
174    COLLECTION_MANIFEST_V1_MAX_MANIFEST_BYTES, COLLECTION_MANIFEST_V1_MAX_RUNTIME_SETS,
175    COLLECTION_MANIFEST_V1_MAX_SOURCES, COLLECTION_MANIFEST_V1_MAX_TAKE_NAME_BYTES,
176    COLLECTION_MANIFEST_V1_SCHEMA_VERSION, CollectionClipV1, CollectionDigestPinV1, CollectionIdV1,
177    CollectionLogicalIdV1, CollectionManifestBudgetV1, CollectionManifestError,
178    CollectionManifestV1, CollectionRuntimeSetKindV1, CollectionRuntimeSetV1,
179    CollectionSourceKeyV1, CollectionSourceV1,
180};
181pub use config::{
182    ClipExpectations, Config, ConfigValidationError, GaitGroup, LoopContinuityTolerances,
183    MovementOwner, Pinned, RuntimeNodeSelectorResolution, RuntimeNodeSelectors, RuntimeNodesConfig,
184    SeveritySetting, SyncGroup, TimeComplementSettings,
185};
186pub use contact_fragment::{
187    CONTACT_FRAGMENT_V1_ID, CONTACT_FRAGMENT_V1_MAX_CANONICAL_BYTES, CONTACT_FRAGMENT_V1_MAX_DEPTH,
188    CONTACT_FRAGMENT_V1_MAX_EVENTS, CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_BYTES,
189    CONTACT_FRAGMENT_V1_MAX_EXTENSION_PAYLOAD_DEPTH, CONTACT_FRAGMENT_V1_MAX_EXTENSIONS,
190    CONTACT_FRAGMENT_V1_MAX_IDENTIFIER_BYTES, CONTACT_FRAGMENT_V1_MAX_SAFE_INTEGER,
191    CONTACT_FRAGMENT_V1_MAX_SOURCE_BYTES, CONTACT_FRAGMENT_V1_MAX_TEXT_BYTES,
192    CONTACT_FRAGMENT_V1_SCHEMA_VERSION, ContactClipReferenceV1, ContactEventKindV1, ContactEventV1,
193    ContactEventWindowV1, ContactExtensionV1, ContactFragmentError, ContactFragmentV1,
194    ContactPhaseV1, ContactProducerV1, ContactRoleV1,
195};
196pub use contact_transform::{
197    CONTACT_TRANSFORM_RESULT_V1_ID, CONTACT_TRANSFORM_RESULT_V1_MAX_CANONICAL_BYTES,
198    CONTACT_TRANSFORM_RESULT_V1_MAX_CONTROL_POINTS, CONTACT_TRANSFORM_RESULT_V1_MAX_EVENT_OUTCOMES,
199    CONTACT_TRANSFORM_RESULT_V1_MAX_MESSAGE_BYTES, CONTACT_TRANSFORM_RESULT_V1_MAX_SOURCE_BYTES,
200    CONTACT_TRANSFORM_RESULT_V1_SCHEMA_VERSION, ContactEventOutcomeV1,
201    ContactTimeWarpControlPointV1, ContactTransformBindingV1, ContactTransformContextV1,
202    ContactTransformError, ContactTransformIntervalV1, ContactTransformOperationV1,
203    ContactTransformOutcomeV1, ContactTransformOutputV1, ContactTransformRefusalCodeV1,
204    ContactTransformRefusalV1, ContactTransformResultV1, ContactTransformedValueV1,
205    transform_contact_fragment_v1,
206};
207pub use contract::{
208    DiffEnvelope, InputIdentity, LintEnvelope, LintEnvelopeV16, LintEnvelopeV17, LintEnvelopeV19,
209    LintFileReport, LintFileReportV16, LintFileReportV17, LintFileReportV19,
210    MEASUREMENTS_SCHEMA_ID, MEASUREMENTS_SCHEMA_VERSION, MEASUREMENTS_V15_SCHEMA_ID,
211    MEASUREMENTS_V15_SCHEMA_VERSION, MEASUREMENTS_V16_SCHEMA_ID, MEASUREMENTS_V16_SCHEMA_VERSION,
212    MEASUREMENTS_V17_SCHEMA_ID, MEASUREMENTS_V17_SCHEMA_VERSION, MeasureEnvelope,
213    MeasureFileReport, MeasurementContract, MeasurementContractError, MeasurementFileError,
214    MeasurementReportError, MeasurementReportFile, MeasurementReportInput,
215    MeasurementReportReadError, OUTPUT_SCHEMA_ID, OUTPUT_SCHEMA_VERSION, OUTPUT_V10_SCHEMA_ID,
216    OUTPUT_V11_MAX_CHECKS_PER_FILE, OUTPUT_V11_MAX_FILES, OUTPUT_V11_MAX_REPORT_BYTES,
217    OUTPUT_V11_SCHEMA_ID, OUTPUT_V11_SCHEMA_VERSION, OUTPUT_V12_SCHEMA_ID,
218    OUTPUT_V12_SCHEMA_VERSION, OUTPUT_V13_SCHEMA_ID, OUTPUT_V13_SCHEMA_VERSION,
219    OUTPUT_V14_SCHEMA_ID, OUTPUT_V14_SCHEMA_VERSION, OUTPUT_V15_SCHEMA_ID,
220    OUTPUT_V15_SCHEMA_VERSION, OUTPUT_V16_SCHEMA_ID, OUTPUT_V16_SCHEMA_VERSION,
221    OUTPUT_V17_SCHEMA_ID, OUTPUT_V17_SCHEMA_VERSION, OUTPUT_V18_SCHEMA_ID,
222    OUTPUT_V18_SCHEMA_VERSION, OutputContractError, RigInfo, RigInfoError, ToolInfo, ToolSource,
223    sha256_hex,
224};
225pub use dependency_closure::{
226    DEPENDENCY_CLOSURE_BUDGET_V1_ID, DEPENDENCY_CLOSURE_V1_ID,
227    DEPENDENCY_CLOSURE_V1_MAX_DEDUP_PROBES, DEPENDENCY_CLOSURE_V1_MAX_EXTERNAL_RESOURCES,
228    DEPENDENCY_CLOSURE_V1_MAX_KEY_BYTES, DEPENDENCY_CLOSURE_V1_MAX_NORMALIZATION_BYTES,
229    DEPENDENCY_CLOSURE_V1_MAX_PATH_COMPONENTS, DEPENDENCY_CLOSURE_V1_MAX_REFERENCES,
230    DEPENDENCY_CLOSURE_V1_MAX_RESOURCE_BYTES, DEPENDENCY_CLOSURE_V1_MAX_TOTAL_RESOURCE_BYTES,
231    DependencyClosureBuilderV1, DependencyClosureCoverageReasonV1, DependencyClosureCoverageV1,
232    DependencyClosureError, DependencyClosureIdentityV1, DependencyClosureReferenceV1,
233    DependencyClosureV1, DependencyClosureWorkV1, DependencyReferenceTargetV1,
234    DependencyResourceKeyV1, DependencyResourcePurposeV1, DependencyResourceRefusalReasonV1,
235    DependencyResourceUnavailableReasonV1, ExternalResourceIdentityV1, ResourceClosureBudgetV1,
236    ResourceKeySyntaxV1,
237};
238pub use directional_speed_evaluation::{
239    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_ID,
240    COLLECTION_DIRECTIONAL_SPEED_EVALUATION_V1_SCHEMA_VERSION,
241    CollectionDirectionalSpeedEvaluationControlError, CollectionDirectionalSpeedEvaluationV1,
242    CollectionDirectionalSpeedEvidenceMemberV1, CollectionDirectionalSpeedEvidenceV1,
243    CollectionDirectionalSpeedFindingV1, CollectionDirectionalSpeedLifecycleV1,
244    CollectionDirectionalSpeedNotEvaluatedReasonV1, evaluate_collection_directional_speed_v1,
245};
246pub use directional_speed_policy::{
247    COLLECTION_DIRECTIONAL_SPEED_EVIDENCE_V1_MAX_BYTES, COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_ID,
248    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_AXIS_COSINE,
249    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_BYTES,
250    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_COMPONENT,
251    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_DIRECTION_TOLERANCE_DEG,
252    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_MEMBERS,
253    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_MAX_SCALAR,
254    COLLECTION_DIRECTIONAL_SPEED_POLICY_V1_SCHEMA_VERSION,
255    CollectionDirectionalSpeedDiagonalBehaviorV1, CollectionDirectionalSpeedManifestIdentityV1,
256    CollectionDirectionalSpeedMemberV1, CollectionDirectionalSpeedModeV1,
257    CollectionDirectionalSpeedPolicyError, CollectionDirectionalSpeedPolicyV1,
258    CollectionDirectionalSpeedSourceBasisV1,
259};
260pub use engine_contract::{
261    ENGINE_CONTRACT_V1_MAX_AGGREGATE_ROWS, ENGINE_CONTRACT_V1_MAX_COLLECTION_ROWS,
262    ENGINE_CONTRACT_V1_MAX_TEXT_BYTES, ENGINE_CONTRACT_V1_MAX_TOTAL_TEXT_BYTES,
263    ENGINE_PROFILE_FACTS_V1_ID, ENGINE_PROFILE_FACTS_V2_ID, EngineAnimationAddressabilityV1,
264    EngineBakeOrExtractV1, EngineClipSettingsV1, EngineClipSettingsV3, EngineContractError,
265    EngineConversionControlV1, EngineCoordinateBasisV1, EngineDefaultStatusV1, EngineFactIdV1,
266    EngineFactIdV2, EngineFactStateV1, EngineFactStateV2, EngineFactValueV1, EngineFactValueV2,
267    EngineForwardAxisV1, EngineHandednessV1, EngineImportHandlingV1, EngineLinearUnitV1,
268    EngineLinearUnitV2, EnginePrimarySourceV1, EnginePrimarySourceV2, EngineProfileFactV1,
269    EngineProfileFactV2, EngineProfileSelectionV1, EngineRootMotionAddressabilityV1,
270    EngineSampleRateV2, EngineSettingApplicabilityV1, EngineSettingDescriptorV1,
271    EngineSettingDescriptorV2, EngineSettingDomainV1, EngineSettingDomainV2, EngineSettingIdV1,
272    EngineSettingIdV2, EngineSettingRowV1, EngineSettingRowV3, EngineSettingScopeV1,
273    EngineSettingValueOriginV3, EngineSettingValueV1, EngineSettingValueV2,
274    EngineTargetAddressabilityV1, EngineUpAxisV1, RESOLVED_ENGINE_SETTINGS_V1_ID,
275    RESOLVED_ENGINE_SETTINGS_V2_ID, RESOLVED_ENGINE_SETTINGS_V3_ID, ReducedRatioV1,
276    ResolvedEngineProfileV1, ResolvedEngineProfileV2, ResolvedEngineSettingsCoverageReasonV2,
277    ResolvedEngineSettingsCoverageStateV2, ResolvedEngineSettingsCoverageV2,
278    ResolvedEngineSettingsV1, ResolvedEngineSettingsV2, ResolvedEngineSettingsV3,
279    ResolvedEngineSettingsWorkV2,
280};
281pub use evaluation::{
282    Applicability, BUILTIN_COVERAGE_GAP_CODES, BUILTIN_EVALUATION_SCOPE_CODES, CheckEvaluation,
283    CheckOutput, CheckSelection, ConfigurationState, CoverageGap, CoverageGapCode, EvaluationError,
284    EvaluationScope, EvaluationScopeCode, EvaluationState, SelectionState, evaluate_checks,
285    evaluate_checks_v2, lint_requires_failure,
286};
287pub use finding::{Finding, MemberMeasurement, Severity, Value};
288pub use foot_cycle::{
289    CONTACT_SUPPORT_DETECTOR_V1_ID, FOOT_CYCLE_PARAMETERIZATION_V1_ID,
290    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_ACCUMULATED_YAW_DEG,
291    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_BYTES, FOOT_CYCLE_PARAMETERIZATION_V1_MAX_CONTACT_EVENTS,
292    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_CONTACT_FRAGMENT_BYTES,
293    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_CONTROL_POINTS,
294    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_HORIZONTAL_DISPLACEMENT_M,
295    FOOT_CYCLE_PARAMETERIZATION_V1_MAX_MEMBERS, FOOT_CYCLE_PARAMETERIZATION_V1_MAX_SLOPE,
296    FOOT_CYCLE_PARAMETERIZATION_V1_SCHEMA_VERSION, FootCycleManifestBindingV1,
297    FootCycleMemberEvidenceV1, FootCycleMemberPlanV1, FootCycleParameterizationError,
298    FootCycleParameterizationMemberV1, FootCycleParameterizationV1, FootCyclePlanV1,
299    FootCycleProofPolicyV1, FootCycleRootMotionBindingV1, FootCycleRootMotionEvidenceV1,
300    plan_foot_cycle_parameterization_v1, transform_contact_support_detector_extension_time_warp_v1,
301    validate_foot_cycle_manifest_binding_v1,
302};
303pub use foot_cycle_clip::{
304    FOOT_CYCLE_CLIP_V1_MAX_CANDIDATE_BYTES, FOOT_CYCLE_CLIP_V1_MAX_GENERATED_KEYS,
305    FOOT_CYCLE_CLIP_V1_MAX_INPUT_KEYS, FOOT_CYCLE_CLIP_V1_MAX_INPUT_VALUES,
306    FOOT_CYCLE_CLIP_V1_MAX_NAME_BYTES, FOOT_CYCLE_CLIP_V1_MAX_TRACKS, FOOT_CYCLE_CLIP_V1_MAX_WORK,
307    FootCycleClipPreflightV1, FootCycleClipResourceV1, FootCycleClipWarpError,
308    FootCycleClipWarpKnotV1, FootCycleClipWarpRowV1, FootCycleCubicSplineRefusalV1,
309    preflight_time_warp_clip_v1, time_warp_clip_v1, time_warp_rows_v1,
310};
311/// Re-export of the exact `glam` version used by animsmith's public math
312/// types, so embedders can construct [`Transform`] values without a
313/// cross-version type mismatch.
314pub use glam;
315pub use metrics::MetricGrids;
316pub use model::{
317    AdditionalInfluenceSet, AffineDomainViolation, Bone, BoneId, Clip, DecodedImageColorType,
318    Document, DocumentShapeError, ImageContainerFormat, ImageSourceKind, ImageUnavailableReason,
319    Interpolation, MaterialResourceAssets, MaterialResourceCoverage, MaterialTextureSlot,
320    MeshInstanceShapeViolation, Property, Skeleton, SourceImageAsset, SourceImageInspection,
321    SourceInfo, SourceInverseBindAccessor, SourceInverseBindAccessorStatus, SourceMaterialAsset,
322    SourceMaterialTextureBinding, SourceNodeAsset, SourceNodeLocalRest, SourceProjectionViolation,
323    SourceSkeletonAssets, SourceSkeletonCoverage, SourceSkinAsset, SourceSkinAttachment,
324    SourceTextureAsset, Track, TrackShapeViolation, TrackValues, Transform,
325    validate_document_shape,
326};
327pub use prediction::{
328    ApplicationWorldUnitPolicyV1, ENGINE_PREDICTION_V1_ID, ENGINE_PREDICTION_V2_ID,
329    ENGINE_PREDICTION_V3_ID, ENGINE_PREDICTION_V4_ID, ENGINE_PREDICTION_V5_ID,
330    ENGINE_PREDICTION_V6_ID, ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_ID,
331    ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_MAX_CLIPS, EngineMachineResultV1, EnginePredictionBasisV1,
332    EnginePredictionBasisV2, EnginePredictionBasisV4, EnginePredictionFacetStateV1,
333    EnginePredictionFacetV1, EnginePredictionFacetV2, EnginePredictionFacetV3,
334    EnginePredictionFacetV4, EnginePredictionV1, EnginePredictionV2, EnginePredictionV3,
335    EnginePredictionV4, EnginePredictionV5, EnginePredictionV6, EngineRootMotionClipIntentInputV1,
336    EngineRootMotionClipIntentV1, EngineRootMotionClipMappingStateV1,
337    EngineRootMotionProjectIntentCountV1, EngineRootMotionProjectIntentCoverageV1,
338    EngineRootMotionProjectIntentV1, ExactSourceClipTimeRangeWireV1,
339    ExactSourceClipTimingBindingV1, ExactSourceFramePeriodWireV1, ExactSourceRangeSelectionWireV1,
340    ExactSourceTimeBasisWireV1, ExactSourceTimeDisplayProtocolWireV1,
341    ExactSourceTimelineModeWireV1, ExactSourceTimingBasisReferenceV1, ExactSourceTimingBindingV1,
342    ExactSourceTimingDomainV1, ExactSourceTimingKeyV1, ExactSourceTimingObservationStateWireV1,
343    ExactSourceTimingObservationWireV1, ExactSourceTimingUnavailableReasonWireV1,
344    FinitePredictionNumberV1, ImportSettingProjectionFieldV1, ImportSettingProjectionKindV1,
345    ImportSettingProjectionResultV1, ImporterScaleConversionV1, ImporterSubjectCreationV1,
346    InventoryCoverageResultV1, MeasurementPointerV1, PREDICTION_PROVENANCE_V1_ID,
347    PREDICTION_PROVENANCE_V2_ID, PREDICTION_PROVENANCE_V3_ID, PREDICTION_PROVENANCE_V4_ID,
348    PREDICTION_PROVENANCE_V5_ID, PREDICTION_PROVENANCE_V6_ID, PREDICTION_RULE_INPUTS_V1_ID,
349    PREDICTION_V1_MAX_AGGREGATE_PROVENANCE_ROWS, PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FACET,
350    PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FILE, PREDICTION_V1_MAX_FACETS_PER_FILE,
351    PREDICTION_V1_MAX_MEASUREMENT_POINTER_COMPONENTS, PREDICTION_V1_MAX_REASONS_PER_FACET,
352    PREDICTION_V1_MAX_TEXT_BYTES, PREDICTION_V1_MAX_TOTAL_TEXT_BYTES_PER_FILE,
353    PREDICTION_V2_MAX_CANDIDATE_FACETS_PER_RULE, ParserFrameRateProjectionWireV1,
354    PredictionBasisIdentityV1, PredictionBasisIdentityV2, PredictionBasisIdentityV4,
355    PredictionBasisReferenceV1, PredictionBasisReferenceV2, PredictionBasisReferenceV4,
356    PredictionContractError, PredictionFacetDemandV2, PredictionInventoryCoverageStateV1,
357    PredictionInventoryDomainV1, PredictionProvenanceIdentityV1, PredictionProvenanceIdentityV2,
358    PredictionProvenanceIdentityV3, PredictionProvenanceIdentityV4, PredictionProvenanceIdentityV5,
359    PredictionProvenanceIdentityV6, PredictionProvenanceV1, PredictionProvenanceV2,
360    PredictionProvenanceV3, PredictionProvenanceV4, PredictionProvenanceV5, PredictionProvenanceV6,
361    PredictionRuleAllocationV2, PredictionRuleDemandV2, PredictionRuleInputsV1, PredictionScalarV1,
362    PredictionUnavailableReasonV1, PredictionUnavailableReasonV2, PredictionUnitV1,
363    RAW_SOURCE_FACTS_V2_ID, RawSceneAttachmentBasisDomainV1, RawSceneAttachmentBasisReferenceV1,
364    RawSceneAttachmentBindingV1, RawSceneAttachmentUnavailableReasonV1, RawSourceAxisV1,
365    RawSourceBasisReferenceV1, RawSourceBindingV1, RawSourceBindingV2, RawSourceCoordinateBasisV1,
366    RawSourceDispositionV1, RawSourceDomainV1, RawSourceFieldIdV1, RawSourceKeyV1,
367    RawSourceObservationStateWireV1, RawSourceObservationWireV1, RawSourceProjectionWorkWireV1,
368    RawSourceProvenanceKindV1, RawSourceProvenanceV1, RawSourceSetCoverageStateV1,
369    RawSourceSetCoverageV1, RawSourceUnavailableReasonV1, ResolvedSettingLocationV1,
370    RootMotionAxisV1, RootMotionCompatibilityV1, RootMotionImporterDispositionV1,
371    RootMotionProjectOwnerV1, RootMotionRoutingResultV1, SourceImportDispositionResultV1,
372    SourceImportDispositionV1, SourceImportSubjectKindV1, SourceNumericDimensionsV1,
373    SourceSkeletonRowKindV1, TransformScaleDomainV1, TransformScaleResultV1,
374    TransformScaleSubjectKindV1, UnitMappingResultV1, allocate_prediction_facets_v2,
375};
376pub use profile::{
377    ResolutionOutcome, ResolvedRoles, RigProfile, Role, RoleResolutionPolicy, builtin_profiles,
378    detect_profile, detect_profile_detailed, resolve_configured_roles, resolve_named,
379    resolve_named_detailed,
380};
381pub use raw_animation_inventory::{
382    RAW_ANIMATION_CHANNEL_INVENTORY_V1_ID, RAW_ANIMATION_CHANNEL_INVENTORY_V1_MAX_CANDIDATES,
383    RawAnimationChannelInventoryV1, RawAnimationChannelRowV1,
384};
385pub use raw_gltf_addressability::{
386    RAW_GLTF_ADDRESSABILITY_INVENTORY_V1_ID, RAW_GLTF_ADDRESSABILITY_V1_MAX_NAME_BYTES,
387    RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_SEGMENTS,
388    RAW_GLTF_ADDRESSABILITY_V1_MAX_READER_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_ROWS_PER_DOMAIN,
389    RAW_GLTF_ADDRESSABILITY_V1_MAX_STRUCTURAL_REFERENCES,
390    RAW_GLTF_ADDRESSABILITY_V1_MAX_TEXT_BYTES, RawGltfAddressabilityCoverageReasonV1,
391    RawGltfAddressabilityCoverageV1, RawGltfAddressabilityInventoryErrorV1,
392    RawGltfAddressabilityInventoryInputV1, RawGltfAddressabilityInventoryReadErrorV1,
393    RawGltfAddressabilityInventoryV1, RawGltfDefaultSceneObservationV1,
394    RawGltfInverseBindMatricesObservationV1, RawGltfNodeRowV1, RawGltfScenePathCandidateRowV1,
395    RawGltfSceneRowV1, RawGltfSkinAttachmentRowV1, RawGltfSkinRowV1,
396};
397pub use raw_scene_inventory::{
398    RAW_SCENE_ATTACHMENT_INVENTORY_V1_ID, RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_ROWS,
399    RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_TEXT_BYTES, RawMeshPrimitiveRowV1,
400    RawMeshPrimitiveRowsV1, RawNodeMeshAttachmentRowV1, RawNodeMeshAttachmentRowsV1,
401    RawPrimitiveTopologyV1, RawSceneAttachmentCoverageV1, RawSceneAttachmentInventoryError,
402    RawSceneAttachmentInventoryV1, RawSceneRootRowV1, RawSceneRootRowsV1,
403    RawSourceSkeletonEvidenceV1,
404};
405pub use raw_transform_path_inventory::{
406    RAW_TRANSFORM_PATH_INVENTORY_V1_ID, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_PARENT_REFERENCES,
407    RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_ROWS, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_TEXT_BYTES,
408    RAW_TRANSFORM_PATH_V1_MAX_DEPTH, RAW_TRANSFORM_PATH_V1_MAX_PATH_BYTES,
409    RAW_TRANSFORM_PATH_V1_MAX_SEGMENT_BYTES, RawTransformPathCoverageReasonV1,
410    RawTransformPathCoverageV1, RawTransformPathInventoryErrorV1, RawTransformPathInventoryV1,
411    RawTransformPathMatchV1, RawTransformPathNodeInputV1, RawTransformPathNodeKindV1,
412    RawTransformPathNodeRowV1, RawTransformPathResolutionV1, RawTransformPathRowAddressabilityV1,
413    RawTransformPathSyntaxErrorV1, RawTransformPathV1,
414};
415pub use sample::{PoseGrid, TrackSample, default_frame_count, sample_clip, sample_track};
416pub use scale::{
417    ProofResidualKind, ScaleBoneRestField, ScaleCandidate, ScaleCapabilityCoverage,
418    ScaleCapabilityFacts, ScaleError, ScaleFieldDisposition, ScaleFieldPlan, ScaleFieldTarget,
419    ScaleOperation, ScalePayloadShapeRow, ScalePlan, ScalePlanLedger, ScaleProjectedRole,
420    ScaleProof, ScaleProofObligation, ScaleProofResidual, ScaleRequest, ScaleRewriteRule,
421    ScaleSourceNodeKind, ScaleSourceRestField, ScaleSourceTopologyRow, ScaleTolerancePolicy,
422    plan_scale, prove_scale,
423};
424pub use skinned_canonical::{
425    SkinnedBindPoseCanonicalization, SkinnedBindPoseCanonicalizationError,
426    SkinnedBindPoseCanonicalizationOptions, SkinnedBindPosePlacement,
427    canonicalize_skinned_bind_pose,
428};
429pub use source_facts::{
430    LoadedSource, RAW_SOURCE_FACTS_V1_ID, RAW_SOURCE_V1_MAX_CLIPS, RAW_SOURCE_V1_MAX_OBSERVATIONS,
431    RAW_SOURCE_V1_MAX_RESOURCE_REFERENCES, RAW_SOURCE_V1_MAX_TEXT_BYTES,
432    RAW_SOURCE_V1_MAX_TOTAL_TEXT_BYTES, RAW_SOURCE_V1_MAX_TRAVERSAL_DEPTH,
433    RawGltfAddressabilityBindingErrorV1, RawSceneAttachmentBindingError, RawSourceFactsBuilderV1,
434    RawSourceFactsV1, RawTransformPathBindingError, SourceAxisV1, SourceChannelFactV1,
435    SourceChannelPropertyV1, SourceClipFactV1, SourceComponentMaskV1, SourceConstructFactV1,
436    SourceConstructKindV1, SourceCoordinateBasisV1, SourceFactDomainV1, SourceFactSetV1,
437    SourceFactsError, SourceFactsViewV1, SourceFormatV1, SourceFramesPerSecondV1,
438    SourceHandednessV1, SourceInterpolationV1, SourceLinearUnitV1, SourceLoaderDispositionV1,
439    SourceLogicalLocatorV1, SourceObservationStateV1, SourceObservationV1, SourceProjectionWorkV1,
440    SourceProvenanceKindV1, SourceProvenanceV1, SourceRelativeLocatorV1, SourceResourceKindV1,
441    SourceResourceLocatorV1, SourceResourceReferenceV1, SourceSetCoverageStateV1,
442    SourceSetCoverageV1, SourceTargetKindV1, SourceTargetV1, SourceTextV1, SourceTimeRangeV1,
443    SourceUnavailableReasonV1,
444};
445pub use source_timing::{
446    EXACT_SOURCE_TIMING_V1_ID, EXACT_SOURCE_TIMING_V1_MAX_CLIPS, ExactSourceClipTimeRangeV1,
447    ExactSourceClipTimingV1, ExactSourceFramePeriodV1, ExactSourceRangeSelectionV1,
448    ExactSourceTimeBasisV1, ExactSourceTimingContractError, ExactSourceTimingObservationStateV1,
449    ExactSourceTimingObservationV1, ExactSourceTimingUnavailableReasonV1, ExactSourceTimingV1,
450    ParserFrameRateProjectionV1, SourceTimeDisplayProtocolV1, SourceTimelineModeV1,
451};
452pub use stance_support::{
453    ResolvedStanceSupportV1, StanceSideV1, StanceSupportRunV1, resolve_stance_support_v1,
454};
455pub use static_bake::{
456    StaticMeshBake, StaticMeshBakeError, StaticMeshBakeEvidence, StaticMeshBakeInstanceEvidence,
457    bake_static_mesh_transforms,
458};
459pub use transition_family::{
460    CollectionTransitionFamilyMemberV1, CollectionTransitionFamilyV1,
461    DocumentTransitionFamilyMemberV1, DocumentTransitionFamilyV1, TRANSITION_FAMILY_V1_ID,
462    TRANSITION_FAMILY_V1_MAX_AGGREGATE_MEMBERS, TRANSITION_FAMILY_V1_MAX_DEPTH,
463    TRANSITION_FAMILY_V1_MAX_DOCUMENT_FAMILY_ID_BYTES, TRANSITION_FAMILY_V1_MAX_FAMILIES,
464    TRANSITION_FAMILY_V1_MAX_MEMBERS_PER_FAMILY, TRANSITION_FAMILY_V1_MAX_NORMALIZED_BYTES,
465    TRANSITION_FAMILY_V1_MAX_SOURCE_BYTES, TRANSITION_FAMILY_V1_MAX_STRING_BYTES,
466    TRANSITION_FAMILY_V1_SCHEMA_VERSION, TransitionFamilyBasisV1, TransitionFamilyBoundaryV1,
467    TransitionFamilyDeclarationInputV1, TransitionFamilyDeclarationV1, TransitionFamilyError,
468    TransitionFamilyManifestIdentityV1, TransitionFamilyTolerancesV1,
469};
470pub use transition_pose_evaluation::{
471    CollectionTransitionPoseMemberInputV1, SkeletonBasisBoneV1, SkeletonBasisError,
472    SkeletonBasisV1, TRANSITION_POSE_EVALUATION_V1_ID,
473    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_COMPARISONS,
474    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_OFFENDERS,
475    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_PAIR_BOUNDARIES,
476    TRANSITION_POSE_EVALUATION_V1_MAX_BASIS_TEXT_BYTES, TRANSITION_POSE_EVALUATION_V1_MAX_BONES,
477    TRANSITION_POSE_EVALUATION_V1_MAX_DOCUMENT_CLIPS,
478    TRANSITION_POSE_EVALUATION_V1_MAX_FAMILY_PAIR_BOUNDARIES,
479    TRANSITION_POSE_EVALUATION_V1_MAX_RAW_TRACK_ROWS_PER_CLIP,
480    TRANSITION_POSE_EVALUATION_V1_MAX_RESULT_BYTES,
481    TRANSITION_POSE_EVALUATION_V1_MAX_ROTATION_OFFENDERS,
482    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACK_ELEMENTS,
483    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACKS_PER_CLIP,
484    TRANSITION_POSE_EVALUATION_V1_MAX_TRANSLATION_OFFENDERS,
485    TRANSITION_POSE_EVALUATION_V1_SCHEMA_VERSION, TransitionPoseDecisionV1,
486    TransitionPoseEvaluationControlError, TransitionPoseEvaluationV1,
487    TransitionPoseFamilyEvaluationV1, TransitionPoseMemberV1, TransitionPosePairEvaluationV1,
488    TransitionPoseReasonV1, TransitionPoseRotationOffenderV1, TransitionPoseStatusV1,
489    TransitionPoseTranslationOffenderV1, evaluate_collection_transition_poses_v1,
490    evaluate_document_transition_poses_v1,
491};