//! behavior-contracts — language-neutral IR runtime COMMON core (Rust).
//!
//! Ports the same thin COMMON primitives as the TS/Python references. No backend,
//! key-resolution, retry-tuning, or DSL-specific concepts — those live in consumers.
//!
//! Public COMMON primitives (runtime-boundary.md §2.1):
//! - [`validate_envelope`] — spec-version fail-closed check
//! - [`evaluate_expression`] — expression-ir.md normative evaluation
//! - [`render_template`] — `{param}` strict rendering
//! - [`run_plan`] — execution-plan skeleton (stage / Skip propagation / Policy Kind)
//! - [`canonical_value`] / [`canonical_json`] / [`py_float_repr`] — canonical serialization
//! - [`assert_portable`] — Portability Guard
//! - [`decode_value`] / [`deep_equals`] — conformance runner adapter COMMON part
pub mod behavior;
pub mod canonical;
#[cfg(feature = "ir")]
pub mod codec;
#[cfg(feature = "ir")]
pub mod envelope;
pub mod expr;
#[cfg(feature = "ir")]
pub mod fingerprint;
#[cfg(feature = "ir")]
pub mod guard;
pub mod plan;
pub mod primitives;
pub mod rawabi;
pub mod template;
pub mod value;
/// Supported spec versions (IR/vector versions; distinct from the crate semver).
pub struct SpecVersions;
impl SpecVersions {
pub const EXPRESSION: i64 = 2; // v2: obj __proto__ own key -> FORBIDDEN_KEY (fail-closed)
pub const TEMPLATE: i64 = 1;
pub const PLAN: i64 = 1;
pub const CANONICAL: i64 = 2; // v2: obj value __proto__ own key -> FORBIDDEN_KEY (fail-closed)
pub const BEHAVIOR: i64 = 5; // v5 carries two changes: (a) a map node's Element Error Policy Kind (error|skip) + the structured detail a Failure carries (scp-error.md) — elementPolicy:skip changes which elements are present; (b) an OMITTED input key for a port DECLARED optional (inputPorts[name].required === false, the opt portable-type constructor) binds to null, the runner reading the component's own inputPorts declaration when building the entry scope. A required / undeclared name is unaffected (still UNKNOWN_BINDING). An old runtime (behavior<=4) loud-rejects a v5 IR via the baked-spec-skew gate + conformance pre-flight version fail-closed.
pub const GUARD: i64 = 3; // Vector-pin the map elementPolicy closed set (error|skip) and the reject of a skip declared where no per-element Failure exists (a batched map). (v2 = assert_compiled + UNTYPED_NODE + operator-type-signature SSoT accept/reject.)
pub const C2: i64 = 1; // v1 (bc#28: c2-catalog-swap — catalog-swap execution + IR structural identity)
pub const PROVENANCE: i64 = 1; // v1 (#128/A6): serialization-boundary canonical fingerprint match (5-language loud reject of tampered/stale) + non-vacuity (CONFORMANCE_MUTATE)
}
/// Default graphddb-shaped supported envelope version (`"<major>.<minor>"`).
pub const ENVELOPE_SPEC_VERSION: &str = "1.1";
// ── re-exports (public surface) ──────────────────────────────────────────────
pub use value::{deep_equals, Value};
#[cfg(feature = "ir")]
pub use expr::evaluate as evaluate_expression;
pub use expr::{cmp_code_points, ExprFailure, ExprFailureCode};
pub use template::{render_template, resolve_partial, TemplateFailure, TemplateFailureCode};
pub use plan::{
run_plan, run_plan_parallel, ElementPolicyKind, ErrorDetail, ErrorKind, ExecOutcome,
ExecutionPlanSpec, OpSpec, PlanFailure, PlanFailureCode, PolicyKind, RelationKind, RunResult,
};
pub use canonical::{
canonical_json, canonical_value, py_float_repr, CanonicalFailure, CanonicalFailureCode,
};
#[cfg(feature = "ir")]
pub use envelope::{validate_envelope, EnvelopeFailure, EnvelopeFailureCode};
#[cfg(feature = "ir")]
pub use guard::{
assert_portable, assert_portable_component_graph, PortabilityError, PORTABLE_EXPR_OPERATORS,
};
#[cfg(feature = "ir")]
pub use behavior::run_behavior;
pub use behavior::{BehaviorError, BehaviorFailureCode, ComponentExec};
// bc#76: RAW handler ABI — the de-boxed handler boundary (RawValue/RawRow, NOT Value).
pub use rawabi::{
raw_from_value, raw_missing_prop, raw_type_mismatch, RawComponentExec, RawOutcome, RawRow,
RawValue,
};
// bc 0.5.0: native PORTS ABI — the de-plumbed port container (native struct behind PortReader,
// NOT a Vec<(String, Value)>).
pub use rawabi::{NativeComponentExec, PortReader};
// bc#77: combined native-ports-in + raw-result-out ABI — the 1.0 read de-box (zero boxed Value
// on both the port AND row plane; inline sequential exec, no run_plan skip-gate).
// bc#94: the seam is nativized — the concrete ports struct flows to the handler by monomorphized
// generic instantiation (`PortReaderT`, no `&dyn`/`as_any`/`downcast`; `&self` so a `Sync` handler
// parallelizes without a forced `Mutex`).
pub use rawabi::{NativeRawComponentExec, PortReaderT};
#[cfg(feature = "ir")]
pub use fingerprint::{fingerprint_component_graph, FingerprintFailure, FingerprintFailureCode};
#[cfg(feature = "ir")]
pub use codec::{decode_value, encode_value, DecodeError};
// ── codegen primitive surface (bc#36 / typed-codegen.md §3.4) ─────────────────
// 生成コードが直呼びできる安定 primitive 公開面。式演算子は `primitives` モジュールで
// 個別関数として公開する(意味論は SSoT `evaluate_expression` へ委譲する薄いラッパ)。
// bounded 並行 / skip・unproduced / hydration helper も同モジュールに含める。
pub use primitives::{
concat_native, hydrate_into, map_with_concurrency, ref_native, ref_opt_native, skip_connection,
skip_single, unproduced_value,
};