Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,12 @@ repos:
language: system
pass_filenames: true
files: ^src/.*\.py$
exclude: ^(tests/|archived/|archive/|scripts/validation/|src/omnibase_core/utils/util_singleton_holders\.py|src/omnibase_core/models/core/model_action_config_value\.py|src/omnibase_core/protocols/).*\.py$
# Exclusions:
# - protocols/: Protocol types define interfaces, not implementations
# - util_singleton_holders.py: Deprecated module with migration docs (no classes, just docstring)
# - model_action_config_value.py: Action config value types
# - model_node_config_value.py: Node config entry and schema types
exclude: ^(tests/|archived/|archive/|scripts/validation/|src/omnibase_core/utils/util_singleton_holders\.py$|src/omnibase_core/models/core/model_action_config_value\.py$|src/omnibase_core/models/configuration/model_node_config_value\.py$|src/omnibase_core/protocols/)
stages: [pre-commit]

- id: validate-enum-model-imports
Expand Down
7 changes: 7 additions & 0 deletions .yaml-validation-allowlist.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ allowed_files:
added: "2024-10-15"
review: "2026-06-13"

- file: "scripts/regenerate_fingerprints.py"
reason: "Must parse YAML to detect node_type before selecting appropriate Pydantic model class - contract
fingerprint regeneration requires raw YAML to determine which model (ModelContractCompute, ModelContractEffect,
etc.) to use for validation via detect_contract_model()"
added: "2025-12-12"
review: "2026-03-12"

# Specific filenames that are allowed (matched by basename)
# Allows the same utility to be used across different module paths (e.g., copied utilities)
allowed_filenames:
Expand Down
53 changes: 23 additions & 30 deletions contracts/runtime/contract_loader_effect.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,42 +18,17 @@
# Contract Metadata
node_type: EFFECT_GENERIC
contract_version: {major: 1, minor: 1, patch: 0}

# Contract fingerprint for drift detection (format: v{version}:{12-char-hash})
# The 12-character hash is a truncated SHA256 of the normalized contract content
# (excluding the fingerprint field itself to avoid circular dependency)
# Regenerate when contract content changes using: poetry run python scripts/compute_contract_fingerprint.py
fingerprint: "v1.1.0:5686d9c0320d"

# Handler requirements for this effect contract
# Effects perform external I/O and require handlers for their operations
handlers:
required:
# Filesystem handler required for directory scanning and file reading operations
- type: filesystem
version: ">=1.0.0"
optional: []

# Kafka topic subscriptions (none for this effect)
subscriptions:
topics: []

# Profile tags for categorization
profile_tags:
- filesystem
- contracts
- discovery
- runtime
- loader

# Fingerprint: SHA-256 hash of canonical normalized contract content (excluding fingerprint field).
# See docs/architecture/CONTRACT_STABILITY_SPEC.md for normalization specification.
fingerprint: "1.1.0:423f8598810c"
# Effect Subcontract
# NOTE: This contract uses `effect_operations` (multi-operation schema) rather than
# `effect` (single-operation schema) because it defines multiple filesystem operations
# (scan_contracts_directory, read_contract_file). Contracts with a single operation
# use the simpler `effect:` key (e.g., event_bus_wiring_effect.yaml).
effect_operations:
version: {major: 1, minor: 0, patch: 0}
subcontract_version: {major: 1, minor: 0, patch: 0}
version: {major: 1, minor: 1, patch: 0}
subcontract_version: {major: 1, minor: 1, patch: 0}

Comment thread
coderabbitai[bot] marked this conversation as resolved.
# Execution configuration
execution_mode: sequential_abort # Abort on first failure
Expand Down Expand Up @@ -228,6 +203,24 @@ effect_operations:
emit_metrics: true
trace_propagation: true

# v1.1.0 Required Fields
handlers:
required: []
optional:
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}
- type: ProtocolFileSystem
version: {major: 1, minor: 0, patch: 0}

profile_tags:
- runtime
- effect
- contracts
- discovery

subscriptions:
topics: []

# Metadata
metadata:
version: {major: 1, minor: 1, patch: 0}
Expand Down
49 changes: 34 additions & 15 deletions contracts/runtime/contract_registry_reducer.yaml
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
---
node_type: REDUCER_GENERIC
contract_version: {major: 1, minor: 1, patch: 0}

# Contract fingerprint for drift detection (format: v{version}:{12-char-hash})
# The 12-character hash is a truncated SHA256 of the normalized contract content
# (excluding the fingerprint field itself to avoid circular dependency)
# Regenerate when contract content changes using: poetry run python scripts/compute_contract_fingerprint.py
fingerprint: "v1.1.0:6d57709afa44"
profile_tags:
- runtime
- contracts
- registry
- configuration
handlers:
required: [] # Reducers are pure state machines - no external I/O handlers
optional: []
# Fingerprint: SHA-256 hash of canonical normalized contract content (excluding fingerprint field).
# See docs/architecture/CONTRACT_STABILITY_SPEC.md for normalization specification.
fingerprint: "1.1.0:c753f440fda3"
state_transitions:
version: {major: 1, minor: 1, patch: 0}
version: {major: 1, minor: 0, patch: 0}
state_machine_version: {major: 1, minor: 0, patch: 0}
state_machine_name: contract_registry_fsm
description: Maintains state of loaded and compiled ONEX contracts using FSM pattern
Expand Down Expand Up @@ -294,6 +283,36 @@ state_transitions:
trigger: undo_clear
version: {major: 1, minor: 0, patch: 0}
operation_type: administrative

# v1.1.0 Required Fields
# NOTE: The `handlers` section defines protocol-based dependencies injected via DI container.
# This is SEPARATE from FSM action types (event, logging, data_capture, persistence) which are
# defined in transition actions.
#
# FSM Action Type Execution:
# The runtime's built-in FSM action executor handles all action_type values. Each action_type
# maps to a runtime capability:
# - event: Publishes events via ProtocolEventBus (optional handler below)
# - logging: Logs via ProtocolLogger (optional handler below)
# - data_capture: Snapshots state to memory/persistence store
# - persistence: Persists FSM state for recovery (when persistence_enabled: true)
#
# The `required: []` means no handlers are MANDATORY for this node to function, since the
# runtime provides default implementations. Optional handlers allow custom implementations.
handlers:
required: []
optional:
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}
- type: ProtocolEventBus
version: {major: 1, minor: 0, patch: 0}

profile_tags:
- runtime
- reducer
- contracts
- registry

metadata:
version: {major: 1, minor: 1, patch: 0}
author: ONEX Framework Team
Expand Down
86 changes: 44 additions & 42 deletions contracts/runtime/event_bus_wiring_effect.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,54 +32,16 @@
# Contract Metadata
node_type: EFFECT_GENERIC
contract_version: {major: 1, minor: 1, patch: 0}

# Contract fingerprint for drift detection (format: v{version}:{12-char-hash})
# The 12-character hash is a truncated SHA256 of the normalized contract content
# (excluding the fingerprint field itself to avoid circular dependency)
# Regenerate when contract content changes using: poetry run python scripts/compute_contract_fingerprint.py
fingerprint: "v1.1.0:dccda0974f39"

# Handler requirements for this effect contract
# Effects perform external I/O and require handlers for their operations
handlers:
required:
# Local handler required for in-memory event bus wiring operations
- type: local
version: ">=1.0.0"
optional:
# Kafka handler optional for distributed event bus deployments
- type: kafka
version: ">=1.0.0"

# Kafka topic subscriptions for this effect
# This node subscribes to these topics to receive events for wiring operations
subscriptions:
topics:
- topic: onex.runtime.node_graph.ready
description: Triggered when node graph is fully instantiated
handler: wire_all_subscriptions
- topic: onex.runtime.node.registered
description: Handle new node registration for hot reload
handler: wire_single_subscription
- topic: onex.runtime.node.unregistered
description: Handle node removal
handler: remove_subscription

# Profile tags for categorization
profile_tags:
- runtime
- event-bus
- subscriptions
- self-hosted
- wiring

# Fingerprint: SHA-256 hash of canonical normalized contract content (excluding fingerprint field).
# See docs/architecture/CONTRACT_STABILITY_SPEC.md for normalization specification.
fingerprint: "1.1.0:5fece4cb7a20"
# Effect Subcontract
# NOTE: This contract uses `effect` (single-operation schema) rather than
# `effect_operations` (multi-operation schema) because it defines a single
# event bus wiring operation. Contracts with multiple operations use
# `effect_operations:` with an operations list (e.g., contract_loader_effect.yaml).
effect:
version: {major: 1, minor: 0, patch: 0}
version: {major: 1, minor: 1, patch: 0}

# Operation identification
operation_name: event_bus_wiring
Expand Down Expand Up @@ -246,6 +208,31 @@ health_check:
critical: false
threshold_ms: 1000

# Event subscriptions (what this node listens to)
# NOTE: Each subscription defines a `handler` field that references a method that MUST be
# implemented by the runtime or node implementation. These handlers are NOT protocol-based
# dependencies (those go in the `handlers` section below). Instead, subscription handlers
# are callback methods that the event bus invokes when matching events arrive.
#
# Handler Implementation Requirements:
# - wire_all_subscriptions: Receives ModelNodeGraphReadyEvent, wires all nodes to their subscriptions
# - wire_single_subscription: Receives ModelNodeRegisteredEvent, wires a single new node
# - remove_subscription: Receives ModelNodeUnregisteredEvent, removes subscription for a node
#
# These handlers are implemented by the NodeEventBusWiringEffect class or provided by the
# runtime's built-in subscription handler executor. See docs/architecture/SUBSCRIPTION_HANDLERS.md.
subscriptions:
topics:
- topic: onex.runtime.node_graph.ready
description: Triggered when node graph is fully instantiated
handler: wire_all_subscriptions
- topic: onex.runtime.node.registered
description: Handle new node registration for hot reload
handler: wire_single_subscription
- topic: onex.runtime.node.unregistered
description: Handle node removal
handler: remove_subscription

Comment thread
coderabbitai[bot] marked this conversation as resolved.
# Events published by this node
publications:
- topic: onex.runtime.ready
Expand All @@ -261,6 +248,21 @@ publications:
description: Wiring encountered a critical error
payload_schema: ModelWiringErrorEvent

# v1.1.0 Required Fields
handlers:
required:
- type: ProtocolEventBus
version: {major: 1, minor: 0, patch: 0}
optional:
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}

profile_tags:
- runtime
- effect
- event-bus
- wiring

# Metadata
metadata:
version: {major: 1, minor: 1, patch: 0}
Expand Down
55 changes: 40 additions & 15 deletions contracts/runtime/node_graph_reducer.yaml
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
---
node_type: REDUCER_GENERIC
contract_version: {major: 1, minor: 1, patch: 0}

# Contract fingerprint for drift detection (format: v{version}:{12-char-hash})
# The 12-character hash is a truncated SHA256 of the normalized contract content
# (excluding the fingerprint field itself to avoid circular dependency)
# Regenerate when contract content changes using: poetry run python scripts/compute_contract_fingerprint.py
fingerprint: "v1.1.0:6cc216f5b6d9"
profile_tags:
- runtime
- node-graph
- lifecycle
- infrastructure
handlers:
required: [] # Reducers are pure state machines - no external I/O handlers
optional: []
# Fingerprint: SHA-256 hash of canonical normalized contract content (excluding fingerprint field).
# See docs/architecture/CONTRACT_STABILITY_SPEC.md for normalization specification.
fingerprint: "1.1.0:a4f95b414375"
state_transitions:
version: {major: 1, minor: 1, patch: 0}
# NOTE: FSM version (1.0.0) intentionally differs from contract_version (1.1.0).
# The contract version tracks overall contract changes (handlers, metadata, profile_tags),
# while the FSM version only increments when states, transitions, or conditions change.
# This separation allows metadata updates without implying FSM structural changes.
version: {major: 1, minor: 0, patch: 0}
Comment on lines +8 to +12

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# First, explore the repository structure
git ls-files | head -30

Repository: OmniNode-ai/omnibase_core

Length of output: 908


🏁 Script executed:

# Look for FSM-related files and the YAML file in question
find . -type f -name "*.yaml" -o -name "*.yml" | grep -E '(node_graph|FSM|runtime)' | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 306


🏁 Script executed:

# Check if src/omnibase_core exists and explore its structure
find . -type d -name "omnibase_core" -o -name "src" | head -10

Repository: OmniNode-ai/omnibase_core

Length of output: 94


🏁 Script executed:

# Explore src/omnibase_core structure
find src/omnibase_core -type f -name "*.py" | head -30

Repository: OmniNode-ai/omnibase_core

Length of output: 1440


🏁 Script executed:

# Read the node_graph_reducer.yaml file
cat contracts/runtime/node_graph_reducer.yaml

Repository: OmniNode-ai/omnibase_core

Length of output: 13804


🏁 Script executed:

# Search for FSM/state machine runtime implementation
find src/omnibase_core -type f -name "*.py" | xargs grep -l "state_machine\|state_transitions\|FSM" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 1309


🏁 Script executed:

# Search for expression evaluator implementation
find src/omnibase_core -type f -name "*.py" | xargs grep -l "expression\|evaluate.*condition\|parse.*expression" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 1323


🏁 Script executed:

# Search for action executor
find src/omnibase_core -type f -name "*.py" | xargs grep -l "action_type\|action_executor\|execute.*action" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 1260


🏁 Script executed:

# Read FSM execution mixin
cat -n src/omnibase_core/mixins/mixin_fsm_execution.py

Repository: OmniNode-ai/omnibase_core

Length of output: 9171


🏁 Script executed:

# Read FSM transition condition model
cat -n src/omnibase_core/models/fsm/model_fsm_transition_condition.py

Repository: OmniNode-ai/omnibase_core

Length of output: 10487


🏁 Script executed:

# Read FSM transition action model
cat -n src/omnibase_core/models/contracts/subcontracts/model_fsmtransitionaction.py

Repository: OmniNode-ai/omnibase_core

Length of output: 4025


🏁 Script executed:

# Search for expression evaluator
find src/omnibase_core -type f -name "*.py" | xargs grep -l "evaluate.*expression\|parse.*expression\|is_not_empty\|equals" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 360


🏁 Script executed:

# Search for FSM executor to find the actual expression evaluation
find src/omnibase_core -type f -name "*fsm*executor*"

Repository: OmniNode-ai/omnibase_core

Length of output: 108


🏁 Script executed:

# Search for action_type enum or constants
find src/omnibase_core -type f -name "*.py" | xargs grep -l "action_type.*enum\|ActionType\|VALID_ACTION_TYPES\|action_type.*event\|action_type.*logging" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 1179


🏁 Script executed:

# Search for wildcard transition handling
find src/omnibase_core -type f -name "*.py" | xargs grep -n "from_state.*\*\|wildcard.*transition" | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 2413


🏁 Script executed:

# Read fsm_executor.py to see expression evaluation
cat -n src/omnibase_core/utils/fsm_executor.py | head -400

Repository: OmniNode-ai/omnibase_core

Length of output: 16641


🏁 Script executed:

# Check comparison operators enum
cat -n src/omnibase_core/enums/enum_comparison_operators.py

Repository: OmniNode-ai/omnibase_core

Length of output: 690


🏁 Script executed:

# Check condition operator enum
cat -n src/omnibase_core/enums/enum_condition_operator.py

Repository: OmniNode-ai/omnibase_core

Length of output: 876


🏁 Script executed:

# Continue reading fsm_executor.py from line 400 onwards
cat -n src/omnibase_core/utils/fsm_executor.py | sed -n '400,550p'

Repository: OmniNode-ai/omnibase_core

Length of output: 7112


🏁 Script executed:

# Search for action executor implementation
find src/omnibase_core -type f -name "*.py" | xargs grep -l "execute.*action\|action_executor" | grep -v test | head -10

Repository: OmniNode-ai/omnibase_core

Length of output: 306


🏁 Script executed:

# Read more of fsm_executor to find action execution
cat -n src/omnibase_core/utils/fsm_executor.py | sed -n '549,700p'

Repository: OmniNode-ai/omnibase_core

Length of output: 4103


🏁 Script executed:

# Search for what action types are actually supported
find src/omnibase_core -type f -name "*.py" | xargs grep -n "action_type.*event\|action_type.*logging\|action_type.*alert\|action_type.*data_capture\|action_type.*persistence\|action_type.*cleanup" | head -30

Repository: OmniNode-ai/omnibase_core

Length of output: 51


🏁 Script executed:

# Look for handler resolution and defaults
find src/omnibase_core -type f -name "*.py" | xargs grep -n "ProtocolLogger\|ProtocolEventBus\|handler.*default\|required.*\[\]" | head -30

Repository: OmniNode-ai/omnibase_core

Length of output: 3724


🏁 Script executed:

# Extract the actual expressions from the YAML file
grep -n "expression:" contracts/runtime/node_graph_reducer.yaml

Repository: OmniNode-ai/omnibase_core

Length of output: 336


🏁 Script executed:

# Search for any special handling of is_not_empty or exists operators
find src/omnibase_core -type f -name "*.py" | xargs grep -n "is_not_empty\|exists\|NOT_EXISTS\|EXISTS" | grep -v test | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 2235


🏁 Script executed:

# Read the exact VALID_OPERATORS whitelist from the condition model
cat -n src/omnibase_core/models/fsm/model_fsm_transition_condition.py | sed -n '99,101p'

Repository: OmniNode-ai/omnibase_core

Length of output: 226


🏁 Script executed:

# Confirm what operators are actually handled in the executor
grep -n "elif operator ==" src/omnibase_core/utils/fsm_executor.py | head -20

Repository: OmniNode-ai/omnibase_core

Length of output: 388


🏁 Script executed:

# Check if there's any override or additional handling for expressions
rg -A5 "is_not_empty|exists" src/omnibase_core/utils/fsm_executor.py

Repository: OmniNode-ai/omnibase_core

Length of output: 798


FSM contract expressions will fail validation—is_not_empty and equals operators are not supported.

The contract declares expressions using unsupported operators that will cause validation/execution failures:

  • Line 112 (node_registry is_not_empty): This is a 2-token expression, but the validator enforces exactly 3 tokens in format field operator value. Additionally, is_not_empty is not in the supported operator whitelist.
  • Lines 118, 142, 148, 195 (using equals): The operator equals is not in ModelFSMTransitionCondition.VALID_OPERATORS (which only includes ==, !=, <, >, <=, >=, in, not_in, contains, matches). Validation will reject these expressions at model instantiation.

The executor does handle equals as an alias for == (line 471 in fsm_executor.py), but the model validator blocks it first. Expressions must conform to the 3-token format with operators from the whitelist.

Suggested fixes:

  • Replace node_registry is_not_empty with a supported pattern (e.g., node_registry != empty or similar 3-token syntax)
  • Replace all instances of equals with ==

Also verify:

  • Wildcard transitions (from_state: '*') are confirmed as supported in the executor
  • Action types (event, logging, alert, data_capture, persistence, cleanup) are passed through intents without explicit type validation in the executor
  • Handler defaults (when required: []) rely on DI container resolution—confirm default implementations exist for all declared action types
🤖 Prompt for AI Agents
In contracts/runtime/node_graph_reducer.yaml around lines 8 and specifically
lines 112, 118, 142, 148 and 195, update FSM transition expressions to conform
to the validator's 3-token format and the operator whitelist: replace the
2-token "node_registry is_not_empty" with a 3-token form such as "node_registry
!= empty" (or another supported operator/value pair), and replace every use of
the unsupported "equals" operator with "=="; after making these operator
changes, verify that wildcard transitions (from_state: "*") are supported by the
executor and confirm that default handler implementations exist in the DI
container for the declared action types (event, logging, alert, data_capture,
persistence, cleanup) so required: [] defaults resolve correctly.

state_machine_version: {major: 1, minor: 0, patch: 0}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
state_machine_name: node_graph_fsm
description: Maintains instantiated node graph state with FSM-driven lifecycle management
Expand Down Expand Up @@ -304,6 +297,38 @@ state_transitions:
trigger: undo_rewire
version: {major: 1, minor: 0, patch: 0}
operation_type: administrative

# v1.1.0 Required Fields
# NOTE: The `handlers` section defines protocol-based dependencies injected via DI container.
# This is SEPARATE from FSM action types (event, logging, data_capture, persistence, alert, cleanup)
# which are defined in transition actions.
#
# FSM Action Type Execution:
# The runtime's built-in FSM action executor handles all action_type values. Each action_type
# maps to a runtime capability:
# - event: Publishes events via ProtocolEventBus (optional handler below)
# - logging: Logs via ProtocolLogger (optional handler below)
# - data_capture: Snapshots state to memory/persistence store
# - persistence: Persists FSM state for recovery (when persistence_enabled: true)
# - alert: Emits alerts via alerting subsystem (monitoring integration)
# - cleanup: Executes resource cleanup procedures
#
# The `required: []` means no handlers are MANDATORY for this node to function, since the
# runtime provides default implementations. Optional handlers allow custom implementations.
handlers:
required: []
optional:
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}
- type: ProtocolEventBus
version: {major: 1, minor: 0, patch: 0}

Comment on lines +301 to +325

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Make required handlers consistent with the transition action types.

handlers.required: [] (Line 299) looks inconsistent with the contract declaring action types like event, logging, and alert throughout the FSM. If those actions are actually executed by the runtime, ProtocolEventBus / ProtocolLogger shouldn’t be optional (or the runtime needs a clearly-defined no-op fallback).

Suggested edit:

 handlers:
-  required: []
-  optional:
-    - type: ProtocolLogger
-      version: {major: 1, minor: 0, patch: 0}
-    - type: ProtocolEventBus
-      version: {major: 1, minor: 0, patch: 0}
+  required:
+    - type: ProtocolEventBus
+      version: {major: 1, minor: 0, patch: 0}
+    - type: ProtocolLogger
+      version: {major: 1, minor: 0, patch: 0}
+  optional: []
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# v1.1.0 Required Fields
handlers:
required: []
optional:
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}
- type: ProtocolEventBus
version: {major: 1, minor: 0, patch: 0}
# v1.1.0 Required Fields
handlers:
required:
- type: ProtocolEventBus
version: {major: 1, minor: 0, patch: 0}
- type: ProtocolLogger
version: {major: 1, minor: 0, patch: 0}
optional: []
🤖 Prompt for AI Agents
In contracts/runtime/node_graph_reducer.yaml around lines 297 to 305,
handlers.required is currently empty while the FSM uses action types like event,
logging, and alert; update the contract so ProtocolEventBus and ProtocolLogger
are listed under handlers.required with their appropriate version entries (or,
alternatively, document and implement a deterministic no-op fallback), ensuring
the runtime either declares these handlers as mandatory or provides a
clearly-defined fallback path for those actions.

profile_tags:
- runtime
- reducer
- node-graph
- lifecycle

metadata:
version: {major: 1, minor: 1, patch: 0}
author: ONEX Framework Team
Expand Down
Loading
Loading