Skip to content

Conversation

@taco-paco
Copy link
Contributor

@taco-paco taco-paco commented Nov 19, 2025

Summary by CodeRabbit

  • Bug Fixes

    • Unified failure handling for scheduled transactions, capturing and surfacing error messages for failed commits.
    • Improved extraction of available/partial signatures from execution failures to reduce silent or incomplete deliveries.
  • Enhancements

    • Added optional error_message to sent commit records and to runtime logs for clearer diagnostics.
    • Updated related components and tests to propagate and display commit error details.

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions
Copy link

github-actions bot commented Nov 19, 2025

Manual Deploy Available

You can trigger a manual deploy of this PR branch to testnet:

Deploy to Testnet 🚀

Alternative: Comment /deploy on this PR to trigger deployment directly.

⚠️ Note: Manual deploy requires authorization. Only authorized users can trigger deployments.

Comment updated automatically when the PR is synchronized.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 19, 2025

📝 Walkthrough

Walkthrough

Refactors intent result processing to accept BroadcastedIntentExecutionResult instead of ExecutionOutputWrapper, unifies error handling to extract optional chain signatures and an optional error_message from execution errors, and threads error_message: Option into SentCommit. Adds signature-accessor methods across several error types (IntentExecutorError, TaskInfoFetcherError, TaskBuilderError, DeliveryPreparatorError, TransactionPreparatorError) and updates related preparator and task-builder error types. Removes the previous EmptyIntentError-specific pathway and updates function signatures that build and process SentCommit.

Possibly related PRs

  • magicblock-labs/magicblock-validator PR 564 — Adds signature-accessor utilities and execution-result shape changes that enable extracting partial/full signatures from broadcasted execution results used here.
  • magicblock-labs/magicblock-validator PR 597 — Introduces intent/executor error modifications and accessors that this PR consumes when deriving signatures and error messages from execution errors.
  • magicblock-labs/magicblock-validator PR 640 — Changes IntentExecutorError variants and mappings; overlaps with this PR’s new signatures() accessor and error-to-signature extraction logic.

Suggested reviewers

  • thlorenz
  • GabrielePicco
  • bmuddha

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'Trigger SentCommit on failure' directly matches the core objective: enabling SentCommit messages to be triggered when undelegation and other errors occur, rather than only on success.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6f520cf and 99ac0c6.

📒 Files selected for processing (1)
  • magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: taco-paco
Repo: magicblock-labs/magicblock-validator PR: 661
File: magicblock-committor-service/src/intent_executor/single_stage_executor.rs:20-28
Timestamp: 2025-11-21T10:22:07.520Z
Learning: In magicblock-committor-service's SingleStageExecutor and TwoStageExecutor (single_stage_executor.rs and two_stage_executor.rs), the fields transaction_strategy, junk, and patched_errors are intentionally public because these executors are designed to be used independently outside of the IntentExecutor scope, and callers need access to these execution reports for cleanup and error handling.
📚 Learning: 2025-10-21T14:00:54.642Z
Learnt from: bmuddha
Repo: magicblock-labs/magicblock-validator PR: 578
File: magicblock-aperture/src/requests/websocket/account_subscribe.rs:18-27
Timestamp: 2025-10-21T14:00:54.642Z
Learning: In magicblock-aperture account_subscribe handler (src/requests/websocket/account_subscribe.rs), the RpcAccountInfoConfig fields data_slice, commitment, and min_context_slot are currently ignored—only encoding is applied. This is tracked as technical debt in issue #579: https://github.com/magicblock-labs/magicblock-validator/issues/579

Applied to files:

  • magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs
🧬 Code graph analysis (1)
magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (1)
magicblock-committor-service/src/transaction_preparator/error.rs (1)
  • signature (20-25)
🔇 Additional comments (5)
magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (5)

98-100: LGTM!

The error wrapping provides semantic context distinguishing buffer preparation failures from ALT creation failures, which aids debugging and error handling upstream.


111-111: LGTM!

Using the generic error parameter to specify InternalError for internal methods while the public API uses DeliveryPreparatorError is a clean layering approach.


560-566: LGTM!

The DeliveryPreparatorError enum provides clear semantic separation between buffer preparation and ALT creation failures, with proper error chaining via #[source].


568-575: LGTM!

The or-pattern delegation to InternalError::signature() is clean and idiomatic. This will automatically benefit from any improvements to the underlying signature() implementation.


577-578: LGTM!

The type alias with a default error parameter is a clean pattern that reduces boilerplate while allowing flexibility for internal methods to use different error types.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 51b5f53 and cb44d0c.

📒 Files selected for processing (16)
  • magicblock-accounts/src/scheduled_commits_processor.rs (4 hunks)
  • magicblock-committor-service/src/intent_executor/error.rs (4 hunks)
  • magicblock-committor-service/src/intent_executor/mod.rs (3 hunks)
  • magicblock-committor-service/src/intent_executor/single_stage_executor.rs (1 hunks)
  • magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (2 hunks)
  • magicblock-committor-service/src/intent_executor/two_stage_executor.rs (2 hunks)
  • magicblock-committor-service/src/tasks/task_builder.rs (2 hunks)
  • magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (2 hunks)
  • magicblock-committor-service/src/transaction_preparator/error.rs (2 hunks)
  • programs/magicblock/src/schedule_transactions/process_scheduled_commit_sent.rs (5 hunks)
  • test-integration/programs/flexi-counter/src/processor.rs (2 hunks)
  • test-integration/programs/flexi-counter/src/state.rs (1 hunks)
  • test-integration/test-committor-service/tests/test_intent_executor.rs (17 hunks)
  • test-integration/test-committor-service/tests/test_ix_commit_local.rs (2 hunks)
  • test-integration/test-committor-service/tests/utils/instructions.rs (1 hunks)
  • test-integration/test-committor-service/tests/utils/transactions.rs (2 hunks)
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-10-14T09:56:14.047Z
Learnt from: taco-paco
Repo: magicblock-labs/magicblock-validator PR: 564
File: test-integration/programs/flexi-counter/src/processor/call_handler.rs:122-125
Timestamp: 2025-10-14T09:56:14.047Z
Learning: The file test-integration/programs/flexi-counter/src/processor/call_handler.rs contains a test smart contract used for integration testing, not production code.

Applied to files:

  • test-integration/programs/flexi-counter/src/state.rs
  • test-integration/test-committor-service/tests/utils/instructions.rs
  • test-integration/test-committor-service/tests/test_ix_commit_local.rs
  • test-integration/test-committor-service/tests/utils/transactions.rs
  • test-integration/test-committor-service/tests/test_intent_executor.rs
  • test-integration/programs/flexi-counter/src/processor.rs
📚 Learning: 2025-11-07T13:09:52.253Z
Learnt from: bmuddha
Repo: magicblock-labs/magicblock-validator PR: 589
File: test-kit/src/lib.rs:275-0
Timestamp: 2025-11-07T13:09:52.253Z
Learning: In test-kit, the transaction scheduler in ExecutionTestEnv is not expected to shut down during tests. Therefore, using `.unwrap()` in test helper methods like `schedule_transaction` is acceptable and will not cause issues in the test environment.

Applied to files:

  • magicblock-committor-service/src/intent_executor/single_stage_executor.rs
  • test-integration/test-committor-service/tests/test_intent_executor.rs
📚 Learning: 2025-11-18T08:47:39.681Z
Learnt from: Dodecahedr0x
Repo: magicblock-labs/magicblock-validator PR: 639
File: magicblock-chainlink/tests/04_redeleg_other_separate_slots.rs:158-165
Timestamp: 2025-11-18T08:47:39.681Z
Learning: In magicblock-chainlink tests involving compressed accounts, `set_remote_slot()` sets the slot of the `AccountSharedData`, while `compressed_account_shared_with_owner_and_slot()` sets the slot of the delegation record. These are two different fields and both calls are necessary.

Applied to files:

  • test-integration/test-committor-service/tests/test_ix_commit_local.rs
📚 Learning: 2025-10-21T14:00:54.642Z
Learnt from: bmuddha
Repo: magicblock-labs/magicblock-validator PR: 578
File: magicblock-aperture/src/requests/websocket/account_subscribe.rs:18-27
Timestamp: 2025-10-21T14:00:54.642Z
Learning: In magicblock-aperture account_subscribe handler (src/requests/websocket/account_subscribe.rs), the RpcAccountInfoConfig fields data_slice, commitment, and min_context_slot are currently ignored—only encoding is applied. This is tracked as technical debt in issue #579: https://github.com/magicblock-labs/magicblock-validator/issues/579

Applied to files:

  • test-integration/test-committor-service/tests/test_ix_commit_local.rs
  • test-integration/test-committor-service/tests/utils/transactions.rs
🧬 Code graph analysis (10)
magicblock-committor-service/src/tasks/task_builder.rs (3)
magicblock-committor-service/src/intent_executor/error.rs (1)
  • signature (29-34)
magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (1)
  • signature (279-285)
magicblock-rpc-client/src/lib.rs (1)
  • signature (82-90)
magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (2)
magicblock-committor-service/src/intent_executor/error.rs (1)
  • signature (29-34)
magicblock-rpc-client/src/lib.rs (1)
  • signature (82-90)
magicblock-committor-service/src/transaction_preparator/error.rs (1)
magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (3)
  • signature (529-534)
  • signature (546-551)
  • from (503-507)
test-integration/test-committor-service/tests/test_ix_commit_local.rs (1)
test-integration/test-committor-service/tests/utils/transactions.rs (1)
  • init_and_delegate_account_on_chain (127-224)
test-integration/test-committor-service/tests/utils/transactions.rs (1)
test-integration/test-committor-service/tests/utils/instructions.rs (1)
  • init_account_and_delegate_ixs (20-51)
magicblock-committor-service/src/intent_executor/error.rs (8)
magicblock-rpc-client/src/lib.rs (2)
  • error (193-195)
  • signature (82-90)
magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (1)
  • signature (279-285)
magicblock-committor-service/src/tasks/task_builder.rs (1)
  • signature (211-216)
magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (2)
  • signature (529-534)
  • signature (546-551)
magicblock-committor-service/src/transaction_preparator/error.rs (1)
  • signature (20-25)
magicblock-committor-service/src/tasks/buffer_task.rs (1)
  • task_type (122-126)
magicblock-committor-service/src/tasks/args_task.rs (1)
  • task_type (146-153)
magicblock-committor-service/src/tasks/mod.rs (1)
  • task_type (89-89)
magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (5)
magicblock-committor-service/src/intent_executor/error.rs (1)
  • signature (29-34)
magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (1)
  • signature (279-285)
magicblock-committor-service/src/tasks/task_builder.rs (1)
  • signature (211-216)
magicblock-committor-service/src/transaction_preparator/error.rs (1)
  • signature (20-25)
magicblock-rpc-client/src/lib.rs (2)
  • signature (82-90)
  • error (193-195)
test-integration/test-committor-service/tests/test_intent_executor.rs (3)
test-integration/programs/flexi-counter/src/state.rs (2)
  • pda (34-37)
  • new (16-22)
test-integration/test-tools/src/conversions.rs (1)
  • err (8-8)
test-integration/test-committor-service/tests/utils/transactions.rs (1)
  • init_and_delegate_account_on_chain (127-224)
test-integration/programs/flexi-counter/src/processor.rs (2)
programs/magicblock/src/magic_context.rs (1)
  • deserialize (18-26)
programs/magicblock/src/task_context.rs (1)
  • deserialize (82-90)
magicblock-accounts/src/scheduled_commits_processor.rs (1)
magicblock-committor-service/src/intent_executor/error.rs (1)
  • signature (29-34)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: run_make_ci_test
  • GitHub Check: Build Project
🔇 Additional comments (18)
test-integration/programs/flexi-counter/src/state.rs (1)

12-13: Undelegation failure constants look appropriate for shared test usage

The new label/code pair is simple, explicit, and being pub makes it easy to coordinate failure injection across the flexi-counter processor and integration tests; this is fine for a test-only program. Based on learnings

magicblock-committor-service/src/tasks/task_builder.rs (1)

10-10: TaskBuilderError::signature() is consistent with the broader error-signature pattern

Delegating to the inner TaskInfoFetcherError::signature() for both commit and finalize variants cleanly exposes an optional transaction signature without changing existing control flow.

Also applies to: 210-217

magicblock-committor-service/src/intent_executor/error.rs (1)

43-47: UndelegationError wiring across executor and mapping logic looks coherent

Adding UndelegationError to both IntentExecutorError and TransactionStrategyExecutionError, mapping it through from_strategy_execution_error, and classifying per-task InstructionError into the new variant when TaskType::Undelegate gives you a clear, dedicated error path for undelegation failures without changing existing behavior for other task types.

Also applies to: 99-103, 153-161, 192-231

magicblock-committor-service/src/intent_executor/task_info_fetcher.rs (1)

13-13: TaskInfoFetcherError::signature() cleanly surfaces RPC signatures

The helper correctly returns None for metadata/decoding issues and delegates to MagicBlockRpcClientError::signature() for RPC failures, which keeps signature propagation uniform for callers like TaskBuilderError.

Also applies to: 278-286

magicblock-committor-service/src/intent_executor/single_stage_executor.rs (1)

178-184: UndelegationError patch handling is consistent with existing retry patterns

The new UndelegationError arm mirrors the existing Actions/CommitID handling by patching the strategy via handle_undelegation_error and returning Continue(to_cleanup), which fits the current single‑stage retry flow without altering CPI-limit or internal-error semantics.

magicblock-committor-service/src/transaction_preparator/error.rs (1)

1-26: Delivery preparation error wiring and signature() helper look correct

Using DeliveryPreparatorError as the inner type with #[from] and delegating signature() to it is consistent with the rest of the error stack and enables signature propagation without changing callers. No issues spotted.

test-integration/test-committor-service/tests/test_ix_commit_local.rs (1)

113-118: Calls updated correctly for optional label

Both call sites now pass None to init_and_delegate_account_on_chain, matching the new (counter_auth, bytes, label) signature while preserving the previous default label behavior. Concurrency pattern in create_bundles remains unchanged.

Also applies to: 395-403

test-integration/test-committor-service/tests/utils/instructions.rs (1)

20-32: Optional label handling for init instruction is sound

init_account_and_delegate_ixs now threads an Option<String> label into create_init_ix, defaulting to "COUNTER" when None. This cleanly enables labeled test setups without changing existing behavior. Implementation is straightforward and correct.

test-integration/test-committor-service/tests/utils/transactions.rs (1)

126-147: Label propagation into init/delegate helper looks correct

Extending init_and_delegate_account_on_chain with label: Option<String> and forwarding it to init_account_and_delegate_ixs is consistent with the utilities in instructions.rs. The rest of the transaction flow remains untouched, so existing behavior is preserved when passing None.

programs/magicblock/src/schedule_transactions/process_scheduled_commit_sent.rs (1)

19-31: error_message addition to SentCommit is well-integrated

Adding error_message: Option<String> to SentCommit/SentCommitPrintable, threading it through the From impl, and conditionally logging it in process_scheduled_commit_sent is consistent and non-breaking. Tests correctly initialize it to None, so existing scenarios remain unchanged while failures can now surface additional context.

Also applies to: 35-45, 47-75, 216-222, 245-261

magicblock-committor-service/src/intent_executor/two_stage_executor.rs (1)

167-196: UndelegationError handling in two‑stage executor is consistent with flow semantics

  • Commit phase: treating UndelegationError as unexpected and returning Break(()) after logging is appropriate, since undelegation should not happen there.
  • Finalize phase: delegating to handle_undelegation_error and returning Continue(to_cleanup) mirrors the existing ActionsError retry‑with‑cleanup path and enables targeted recovery.

ControlFlow behavior and logging look correct; no further issues spotted.

Also applies to: 210-238

magicblock-committor-service/src/intent_executor/mod.rs (2)

550-553: Undelegation errors treated as non-persisted status looks correct

Grouping UndelegationError with CommitIDError/ActionsError/CpiLimitError so that persist_result returns None avoids clobbering more precise intermediate statuses and matches the “recoverable / retried-internally” semantics those other variants have. This aligns well with the new undelegation‑recovery tests.


791-795: Resetting TaskInfoFetcher on any undelegate intent is a good conservative choice

The added comment and condition if result.is_err() || is_undelegate make it explicit that caches are reset even when undelegation tasks are dropped and the overall execution succeeds. Given undelegated accounts shouldn’t be committed again, this conservative reset is reasonable and keeps cache invariants simple.

test-integration/test-committor-service/tests/test_intent_executor.rs (2)

38-40: New undelegation error-parsing test and imports look solid

Importing FAIL_UNDELEGATION_LABEL and using it in test_undelegation_error_parsing to force an undelegation failure exercises the new TransactionStrategyExecutionError::UndelegationError path end‑to‑end. The assertions on the variant and the error message string provide good coverage of both classification and formatting, in line with the existing CommitID/Actions/CPI tests.

Also applies to: 161-208


121-121: setup_counter refactor and callsite updates are clean

Refactoring setup_counter to take an optional label: Option<String> and wiring all existing callsites with None (plus the failure scenarios with Some(FAIL_UNDELEGATION_LABEL.to_string())) keeps the tests DRY while enabling targeted undelegation failures. The helper’s use of init_and_delegate_account_on_chain and explicit owner override to program_flexi_counter::id() matches the previous patterns and looks correct.

Also applies to: 222-222, 283-283, 340-341, 436-437, 488-488, 547-547, 635-635, 831-842

magicblock-committor-service/src/transaction_preparator/delivery_preparator.rs (1)

78-83: Structured error mapping in prepare_for_delivery is clear and composable

Wrapping task-preparation failures into FailedToPrepareBufferAccounts and ALT preparation failures into FailedToCreateALTError cleanly separates the two concerns and gives upstream code a precise failure surface, while still allowing InternalError to carry the concrete root cause. This is a good alignment with the rest of the new error hierarchy.

magicblock-accounts/src/scheduled_commits_processor.rs (2)

19-20: Unified result handling now reliably emits SentCommit on failures

Switching the result loop to operate on BroadcastedIntentExecutionResult and funnelling both Ok and Err cases through process_intent_result guarantees that on-chain triggered intents always produce a SentCommit, even when execution fails. Deriving chain_signatures from either ExecutionOutput or err.signatures() and logging the error before building the commit keeps the behavior consistent with prior logging while satisfying the “trigger SentCommit on failure” requirement.

Also applies to: 175-249, 252-305


307-323: SentCommit extension with error_message is consistent and non-breaking at call sites

Updating build_sent_commit to accept and set error_message: Option<String> cleanly threads failure context into the SentCommit payload while leaving the rest of the structure unchanged. All call sites in this module now pass the appropriate value (always Some on error, None on success), which should make downstream consumers simpler.

@taco-paco taco-paco changed the base branch from master to feat/base-layer-ix/strip-failed-undelegation November 21, 2025 07:03
@taco-paco taco-paco force-pushed the feat/base-layer-ix/trigger-sent-commit-on-failure branch from cb44d0c to d02cc05 Compare November 21, 2025 07:05
feat: trigger SentCommit on intent failure and failed retry
@taco-paco taco-paco force-pushed the feat/base-layer-ix/trigger-sent-commit-on-failure branch from d02cc05 to e4f241d Compare November 21, 2025 10:13
@taco-paco taco-paco force-pushed the feat/base-layer-ix/strip-failed-undelegation branch from ff9d2a5 to 150554e Compare November 22, 2025 11:15
…/base-layer-ix/trigger-sent-commit-on-failure

# Conflicts:
#	test-integration/test-committor-service/tests/test_ix_commit_local.rs
Base automatically changed from feat/base-layer-ix/strip-failed-undelegation to master November 22, 2025 12:06
…failure

# Conflicts:
#	test-integration/Cargo.lock
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4cbdec3 and 6f520cf.

📒 Files selected for processing (1)
  • magicblock-accounts/src/scheduled_commits_processor.rs (5 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: taco-paco
Repo: magicblock-labs/magicblock-validator PR: 661
File: magicblock-committor-service/src/intent_executor/single_stage_executor.rs:20-28
Timestamp: 2025-11-21T10:22:07.520Z
Learning: In magicblock-committor-service's SingleStageExecutor and TwoStageExecutor (single_stage_executor.rs and two_stage_executor.rs), the fields transaction_strategy, junk, and patched_errors are intentionally public because these executors are designed to be used independently outside of the IntentExecutor scope, and callers need access to these execution reports for cleanup and error handling.
📚 Learning: 2025-11-21T10:22:07.520Z
Learnt from: taco-paco
Repo: magicblock-labs/magicblock-validator PR: 661
File: magicblock-committor-service/src/intent_executor/single_stage_executor.rs:20-28
Timestamp: 2025-11-21T10:22:07.520Z
Learning: In magicblock-committor-service's SingleStageExecutor and TwoStageExecutor (single_stage_executor.rs and two_stage_executor.rs), the fields transaction_strategy, junk, and patched_errors are intentionally public because these executors are designed to be used independently outside of the IntentExecutor scope, and callers need access to these execution reports for cleanup and error handling.

Applied to files:

  • magicblock-accounts/src/scheduled_commits_processor.rs
🧬 Code graph analysis (1)
magicblock-accounts/src/scheduled_commits_processor.rs (3)
magicblock-rpc-client/src/lib.rs (1)
  • error (193-195)
magicblock-committor-service/src/intent_executor/error.rs (1)
  • signature (29-34)
magicblock-committor-service/src/transaction_preparator/error.rs (1)
  • signature (20-25)
🔇 Additional comments (3)
magicblock-accounts/src/scheduled_commits_processor.rs (3)

7-21: Imports and result type wiring look consistent

Using log::{debug, error, info} matches the macros used in this file, and switching to BroadcastedIntentExecutionResult alongside ExecutionOutput keeps the result-processing API coherent with the committor service. No issues here.


236-243: Centralizing result handling via process_intent_result is a good direction

Forwarding the full BroadcastedIntentExecutionResult and the corresponding ScheduledBaseIntentMeta into process_intent_result neatly centralizes the construction of SentCommit for both success and failure paths, which aligns with the PR goal of always emitting a SentCommit.


301-317: SentCommit extension with error_message is consistent and complete

build_sent_commit now threads error_message: Option<String> all the way into SentCommit, while preserving existing fields (chain_signatures, included_pubkeys, requested_undelegation, etc.). This cleanly enables downstream consumers to distinguish and introspect failures without affecting the success path.

Copy link
Collaborator

@GabrielePicco GabrielePicco left a comment

Choose a reason for hiding this comment

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

LGTM!

@taco-paco taco-paco merged commit 8bb1c21 into master Nov 25, 2025
18 checks passed
@taco-paco taco-paco deleted the feat/base-layer-ix/trigger-sent-commit-on-failure branch November 25, 2025 12:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants