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    FootCycleCubicSplineRefusalV1, preflight_time_warp_clip_v1, time_warp_clip_v1,
309};
310/// Re-export of the exact `glam` version used by animsmith's public math
311/// types, so embedders can construct [`Transform`] values without a
312/// cross-version type mismatch.
313pub use glam;
314pub use metrics::MetricGrids;
315pub use model::{
316    AdditionalInfluenceSet, AffineDomainViolation, Bone, BoneId, Clip, DecodedImageColorType,
317    Document, DocumentShapeError, ImageContainerFormat, ImageSourceKind, ImageUnavailableReason,
318    Interpolation, MaterialResourceAssets, MaterialResourceCoverage, MaterialTextureSlot,
319    MeshInstanceShapeViolation, Property, Skeleton, SourceImageAsset, SourceImageInspection,
320    SourceInfo, SourceInverseBindAccessor, SourceInverseBindAccessorStatus, SourceMaterialAsset,
321    SourceMaterialTextureBinding, SourceNodeAsset, SourceNodeLocalRest, SourceProjectionViolation,
322    SourceSkeletonAssets, SourceSkeletonCoverage, SourceSkinAsset, SourceSkinAttachment,
323    SourceTextureAsset, Track, TrackShapeViolation, TrackValues, Transform,
324    validate_document_shape,
325};
326pub use prediction::{
327    ApplicationWorldUnitPolicyV1, ENGINE_PREDICTION_V1_ID, ENGINE_PREDICTION_V2_ID,
328    ENGINE_PREDICTION_V3_ID, ENGINE_PREDICTION_V4_ID, ENGINE_PREDICTION_V5_ID,
329    ENGINE_PREDICTION_V6_ID, ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_ID,
330    ENGINE_ROOT_MOTION_PROJECT_INTENT_V1_MAX_CLIPS, EngineMachineResultV1, EnginePredictionBasisV1,
331    EnginePredictionBasisV2, EnginePredictionBasisV4, EnginePredictionFacetStateV1,
332    EnginePredictionFacetV1, EnginePredictionFacetV2, EnginePredictionFacetV3,
333    EnginePredictionFacetV4, EnginePredictionV1, EnginePredictionV2, EnginePredictionV3,
334    EnginePredictionV4, EnginePredictionV5, EnginePredictionV6, EngineRootMotionClipIntentInputV1,
335    EngineRootMotionClipIntentV1, EngineRootMotionClipMappingStateV1,
336    EngineRootMotionProjectIntentCountV1, EngineRootMotionProjectIntentCoverageV1,
337    EngineRootMotionProjectIntentV1, ExactSourceClipTimeRangeWireV1,
338    ExactSourceClipTimingBindingV1, ExactSourceFramePeriodWireV1, ExactSourceRangeSelectionWireV1,
339    ExactSourceTimeBasisWireV1, ExactSourceTimeDisplayProtocolWireV1,
340    ExactSourceTimelineModeWireV1, ExactSourceTimingBasisReferenceV1, ExactSourceTimingBindingV1,
341    ExactSourceTimingDomainV1, ExactSourceTimingKeyV1, ExactSourceTimingObservationStateWireV1,
342    ExactSourceTimingObservationWireV1, ExactSourceTimingUnavailableReasonWireV1,
343    FinitePredictionNumberV1, ImportSettingProjectionFieldV1, ImportSettingProjectionKindV1,
344    ImportSettingProjectionResultV1, ImporterScaleConversionV1, ImporterSubjectCreationV1,
345    InventoryCoverageResultV1, MeasurementPointerV1, PREDICTION_PROVENANCE_V1_ID,
346    PREDICTION_PROVENANCE_V2_ID, PREDICTION_PROVENANCE_V3_ID, PREDICTION_PROVENANCE_V4_ID,
347    PREDICTION_PROVENANCE_V5_ID, PREDICTION_PROVENANCE_V6_ID, PREDICTION_RULE_INPUTS_V1_ID,
348    PREDICTION_V1_MAX_AGGREGATE_PROVENANCE_ROWS, PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FACET,
349    PREDICTION_V1_MAX_BASIS_REFERENCES_PER_FILE, PREDICTION_V1_MAX_FACETS_PER_FILE,
350    PREDICTION_V1_MAX_MEASUREMENT_POINTER_COMPONENTS, PREDICTION_V1_MAX_REASONS_PER_FACET,
351    PREDICTION_V1_MAX_TEXT_BYTES, PREDICTION_V1_MAX_TOTAL_TEXT_BYTES_PER_FILE,
352    PREDICTION_V2_MAX_CANDIDATE_FACETS_PER_RULE, ParserFrameRateProjectionWireV1,
353    PredictionBasisIdentityV1, PredictionBasisIdentityV2, PredictionBasisIdentityV4,
354    PredictionBasisReferenceV1, PredictionBasisReferenceV2, PredictionBasisReferenceV4,
355    PredictionContractError, PredictionFacetDemandV2, PredictionInventoryCoverageStateV1,
356    PredictionInventoryDomainV1, PredictionProvenanceIdentityV1, PredictionProvenanceIdentityV2,
357    PredictionProvenanceIdentityV3, PredictionProvenanceIdentityV4, PredictionProvenanceIdentityV5,
358    PredictionProvenanceIdentityV6, PredictionProvenanceV1, PredictionProvenanceV2,
359    PredictionProvenanceV3, PredictionProvenanceV4, PredictionProvenanceV5, PredictionProvenanceV6,
360    PredictionRuleAllocationV2, PredictionRuleDemandV2, PredictionRuleInputsV1, PredictionScalarV1,
361    PredictionUnavailableReasonV1, PredictionUnavailableReasonV2, PredictionUnitV1,
362    RAW_SOURCE_FACTS_V2_ID, RawSceneAttachmentBasisDomainV1, RawSceneAttachmentBasisReferenceV1,
363    RawSceneAttachmentBindingV1, RawSceneAttachmentUnavailableReasonV1, RawSourceAxisV1,
364    RawSourceBasisReferenceV1, RawSourceBindingV1, RawSourceBindingV2, RawSourceCoordinateBasisV1,
365    RawSourceDispositionV1, RawSourceDomainV1, RawSourceFieldIdV1, RawSourceKeyV1,
366    RawSourceObservationStateWireV1, RawSourceObservationWireV1, RawSourceProjectionWorkWireV1,
367    RawSourceProvenanceKindV1, RawSourceProvenanceV1, RawSourceSetCoverageStateV1,
368    RawSourceSetCoverageV1, RawSourceUnavailableReasonV1, ResolvedSettingLocationV1,
369    RootMotionAxisV1, RootMotionCompatibilityV1, RootMotionImporterDispositionV1,
370    RootMotionProjectOwnerV1, RootMotionRoutingResultV1, SourceImportDispositionResultV1,
371    SourceImportDispositionV1, SourceImportSubjectKindV1, SourceNumericDimensionsV1,
372    SourceSkeletonRowKindV1, TransformScaleDomainV1, TransformScaleResultV1,
373    TransformScaleSubjectKindV1, UnitMappingResultV1, allocate_prediction_facets_v2,
374};
375pub use profile::{
376    ResolutionOutcome, ResolvedRoles, RigProfile, Role, RoleResolutionPolicy, builtin_profiles,
377    detect_profile, detect_profile_detailed, resolve_configured_roles, resolve_named,
378    resolve_named_detailed,
379};
380pub use raw_animation_inventory::{
381    RAW_ANIMATION_CHANNEL_INVENTORY_V1_ID, RAW_ANIMATION_CHANNEL_INVENTORY_V1_MAX_CANDIDATES,
382    RawAnimationChannelInventoryV1, RawAnimationChannelRowV1,
383};
384pub use raw_gltf_addressability::{
385    RAW_GLTF_ADDRESSABILITY_INVENTORY_V1_ID, RAW_GLTF_ADDRESSABILITY_V1_MAX_NAME_BYTES,
386    RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_PATH_SEGMENTS,
387    RAW_GLTF_ADDRESSABILITY_V1_MAX_READER_BYTES, RAW_GLTF_ADDRESSABILITY_V1_MAX_ROWS_PER_DOMAIN,
388    RAW_GLTF_ADDRESSABILITY_V1_MAX_STRUCTURAL_REFERENCES,
389    RAW_GLTF_ADDRESSABILITY_V1_MAX_TEXT_BYTES, RawGltfAddressabilityCoverageReasonV1,
390    RawGltfAddressabilityCoverageV1, RawGltfAddressabilityInventoryErrorV1,
391    RawGltfAddressabilityInventoryInputV1, RawGltfAddressabilityInventoryReadErrorV1,
392    RawGltfAddressabilityInventoryV1, RawGltfDefaultSceneObservationV1,
393    RawGltfInverseBindMatricesObservationV1, RawGltfNodeRowV1, RawGltfScenePathCandidateRowV1,
394    RawGltfSceneRowV1, RawGltfSkinAttachmentRowV1, RawGltfSkinRowV1,
395};
396pub use raw_scene_inventory::{
397    RAW_SCENE_ATTACHMENT_INVENTORY_V1_ID, RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_ROWS,
398    RAW_SCENE_ATTACHMENT_INVENTORY_V1_MAX_TEXT_BYTES, RawMeshPrimitiveRowV1,
399    RawMeshPrimitiveRowsV1, RawNodeMeshAttachmentRowV1, RawNodeMeshAttachmentRowsV1,
400    RawPrimitiveTopologyV1, RawSceneAttachmentCoverageV1, RawSceneAttachmentInventoryError,
401    RawSceneAttachmentInventoryV1, RawSceneRootRowV1, RawSceneRootRowsV1,
402    RawSourceSkeletonEvidenceV1,
403};
404pub use raw_transform_path_inventory::{
405    RAW_TRANSFORM_PATH_INVENTORY_V1_ID, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_PARENT_REFERENCES,
406    RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_ROWS, RAW_TRANSFORM_PATH_INVENTORY_V1_MAX_TEXT_BYTES,
407    RAW_TRANSFORM_PATH_V1_MAX_DEPTH, RAW_TRANSFORM_PATH_V1_MAX_PATH_BYTES,
408    RAW_TRANSFORM_PATH_V1_MAX_SEGMENT_BYTES, RawTransformPathCoverageReasonV1,
409    RawTransformPathCoverageV1, RawTransformPathInventoryErrorV1, RawTransformPathInventoryV1,
410    RawTransformPathMatchV1, RawTransformPathNodeInputV1, RawTransformPathNodeKindV1,
411    RawTransformPathNodeRowV1, RawTransformPathResolutionV1, RawTransformPathRowAddressabilityV1,
412    RawTransformPathSyntaxErrorV1, RawTransformPathV1,
413};
414pub use sample::{PoseGrid, TrackSample, default_frame_count, sample_clip, sample_track};
415pub use scale::{
416    ProofResidualKind, ScaleBoneRestField, ScaleCandidate, ScaleCapabilityCoverage,
417    ScaleCapabilityFacts, ScaleError, ScaleFieldDisposition, ScaleFieldPlan, ScaleFieldTarget,
418    ScaleOperation, ScalePayloadShapeRow, ScalePlan, ScalePlanLedger, ScaleProjectedRole,
419    ScaleProof, ScaleProofObligation, ScaleProofResidual, ScaleRequest, ScaleRewriteRule,
420    ScaleSourceNodeKind, ScaleSourceRestField, ScaleSourceTopologyRow, ScaleTolerancePolicy,
421    plan_scale, prove_scale,
422};
423pub use skinned_canonical::{
424    SkinnedBindPoseCanonicalization, SkinnedBindPoseCanonicalizationError,
425    SkinnedBindPoseCanonicalizationOptions, SkinnedBindPosePlacement,
426    canonicalize_skinned_bind_pose,
427};
428pub use source_facts::{
429    LoadedSource, RAW_SOURCE_FACTS_V1_ID, RAW_SOURCE_V1_MAX_CLIPS, RAW_SOURCE_V1_MAX_OBSERVATIONS,
430    RAW_SOURCE_V1_MAX_RESOURCE_REFERENCES, RAW_SOURCE_V1_MAX_TEXT_BYTES,
431    RAW_SOURCE_V1_MAX_TOTAL_TEXT_BYTES, RAW_SOURCE_V1_MAX_TRAVERSAL_DEPTH,
432    RawGltfAddressabilityBindingErrorV1, RawSceneAttachmentBindingError, RawSourceFactsBuilderV1,
433    RawSourceFactsV1, RawTransformPathBindingError, SourceAxisV1, SourceChannelFactV1,
434    SourceChannelPropertyV1, SourceClipFactV1, SourceComponentMaskV1, SourceConstructFactV1,
435    SourceConstructKindV1, SourceCoordinateBasisV1, SourceFactDomainV1, SourceFactSetV1,
436    SourceFactsError, SourceFactsViewV1, SourceFormatV1, SourceFramesPerSecondV1,
437    SourceHandednessV1, SourceInterpolationV1, SourceLinearUnitV1, SourceLoaderDispositionV1,
438    SourceLogicalLocatorV1, SourceObservationStateV1, SourceObservationV1, SourceProjectionWorkV1,
439    SourceProvenanceKindV1, SourceProvenanceV1, SourceRelativeLocatorV1, SourceResourceKindV1,
440    SourceResourceLocatorV1, SourceResourceReferenceV1, SourceSetCoverageStateV1,
441    SourceSetCoverageV1, SourceTargetKindV1, SourceTargetV1, SourceTextV1, SourceTimeRangeV1,
442    SourceUnavailableReasonV1,
443};
444pub use source_timing::{
445    EXACT_SOURCE_TIMING_V1_ID, EXACT_SOURCE_TIMING_V1_MAX_CLIPS, ExactSourceClipTimeRangeV1,
446    ExactSourceClipTimingV1, ExactSourceFramePeriodV1, ExactSourceRangeSelectionV1,
447    ExactSourceTimeBasisV1, ExactSourceTimingContractError, ExactSourceTimingObservationStateV1,
448    ExactSourceTimingObservationV1, ExactSourceTimingUnavailableReasonV1, ExactSourceTimingV1,
449    ParserFrameRateProjectionV1, SourceTimeDisplayProtocolV1, SourceTimelineModeV1,
450};
451pub use stance_support::{
452    ResolvedStanceSupportV1, StanceSideV1, StanceSupportRunV1, resolve_stance_support_v1,
453};
454pub use static_bake::{
455    StaticMeshBake, StaticMeshBakeError, StaticMeshBakeEvidence, StaticMeshBakeInstanceEvidence,
456    bake_static_mesh_transforms,
457};
458pub use transition_family::{
459    CollectionTransitionFamilyMemberV1, CollectionTransitionFamilyV1,
460    DocumentTransitionFamilyMemberV1, DocumentTransitionFamilyV1, TRANSITION_FAMILY_V1_ID,
461    TRANSITION_FAMILY_V1_MAX_AGGREGATE_MEMBERS, TRANSITION_FAMILY_V1_MAX_DEPTH,
462    TRANSITION_FAMILY_V1_MAX_DOCUMENT_FAMILY_ID_BYTES, TRANSITION_FAMILY_V1_MAX_FAMILIES,
463    TRANSITION_FAMILY_V1_MAX_MEMBERS_PER_FAMILY, TRANSITION_FAMILY_V1_MAX_NORMALIZED_BYTES,
464    TRANSITION_FAMILY_V1_MAX_SOURCE_BYTES, TRANSITION_FAMILY_V1_MAX_STRING_BYTES,
465    TRANSITION_FAMILY_V1_SCHEMA_VERSION, TransitionFamilyBasisV1, TransitionFamilyBoundaryV1,
466    TransitionFamilyDeclarationInputV1, TransitionFamilyDeclarationV1, TransitionFamilyError,
467    TransitionFamilyManifestIdentityV1, TransitionFamilyTolerancesV1,
468};
469pub use transition_pose_evaluation::{
470    CollectionTransitionPoseMemberInputV1, SkeletonBasisBoneV1, SkeletonBasisError,
471    SkeletonBasisV1, TRANSITION_POSE_EVALUATION_V1_ID,
472    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_COMPARISONS,
473    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_OFFENDERS,
474    TRANSITION_POSE_EVALUATION_V1_MAX_AGGREGATE_PAIR_BOUNDARIES,
475    TRANSITION_POSE_EVALUATION_V1_MAX_BASIS_TEXT_BYTES, TRANSITION_POSE_EVALUATION_V1_MAX_BONES,
476    TRANSITION_POSE_EVALUATION_V1_MAX_DOCUMENT_CLIPS,
477    TRANSITION_POSE_EVALUATION_V1_MAX_FAMILY_PAIR_BOUNDARIES,
478    TRANSITION_POSE_EVALUATION_V1_MAX_RAW_TRACK_ROWS_PER_CLIP,
479    TRANSITION_POSE_EVALUATION_V1_MAX_RESULT_BYTES,
480    TRANSITION_POSE_EVALUATION_V1_MAX_ROTATION_OFFENDERS,
481    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACK_ELEMENTS,
482    TRANSITION_POSE_EVALUATION_V1_MAX_SELECTED_TRACKS_PER_CLIP,
483    TRANSITION_POSE_EVALUATION_V1_MAX_TRANSLATION_OFFENDERS,
484    TRANSITION_POSE_EVALUATION_V1_SCHEMA_VERSION, TransitionPoseDecisionV1,
485    TransitionPoseEvaluationControlError, TransitionPoseEvaluationV1,
486    TransitionPoseFamilyEvaluationV1, TransitionPoseMemberV1, TransitionPosePairEvaluationV1,
487    TransitionPoseReasonV1, TransitionPoseRotationOffenderV1, TransitionPoseStatusV1,
488    TransitionPoseTranslationOffenderV1, evaluate_collection_transition_poses_v1,
489    evaluate_document_transition_poses_v1,
490};