Surface relay submission errors in lifecycle
All checks were successful
deploy / deploy (push) Successful in 54s

Proof: npm test passes 238/238; operator-dashboard static UI test covers Relay response error_message and note rendering; operator-dashboard bundle builds successfully.

Assumptions: executor trade_result payloads already persist relay submission error.message and note fields for lifecycle rows, so this change only exposes stored evidence in the expanded dashboard detail.

Still fake: venue-native terminal fill ids and realized fee/PnL attribution remain unavailable.
This commit is contained in:
philipp 2026-05-18 22:05:49 +02:00
parent 6f31879480
commit 1a071c5b10
2 changed files with 8 additions and 1 deletions

View file

@ -133,7 +133,11 @@ function LifecycleDetails({ item }) {
<StageCard at={item.execution_result_at} status={item.execution?.status || 'No relay result'} title="4. Relay response"> <StageCard at={item.execution_result_at} status={item.execution?.status || 'No relay result'} title="4. Relay response">
<div>{item.execution?.result_code || 'No executor result code stored'}</div> <div>{item.execution?.result_code || 'No executor result code stored'}</div>
{item.execution?.error_message ? <div className="status-subtle">{item.execution.error_message}</div> : null}
{!item.execution?.error_message && item.execution?.note ? <div className="status-subtle">{item.execution.note}</div> : null}
{item.execution?.status === 'submitted' ? (
<div className="status-subtle">Submitted means the relay accepted the response; it does not prove a trade.</div> <div className="status-subtle">Submitted means the relay accepted the response; it does not prove a trade.</div>
) : null}
</StageCard> </StageCard>
<StageCard at={item.outcome_observed_at} status={item.outcome_status || item.lifecycle_state} title="5. Outcome and settlement"> <StageCard at={item.outcome_observed_at} status={item.outcome_status || item.lifecycle_state} title="5. Outcome and settlement">

View file

@ -27,6 +27,9 @@ test('strategy page owns consolidated quote lifecycle and successful trade table
assert.match(strategySource, /Pause display/); assert.match(strategySource, /Pause display/);
assert.match(strategySource, /Resume display/); assert.match(strategySource, /Resume display/);
assert.match(strategySource, /setDisplayItems\(items \|\| \[\]\)/); assert.match(strategySource, /setDisplayItems\(items \|\| \[\]\)/);
assert.match(strategySource, /item\.execution\?\.error_message/);
assert.match(strategySource, /item\.execution\?\.note/);
assert.match(strategySource, /item\.execution\?\.status === 'submitted'/);
assert.match(strategySource, /Submitted means the relay accepted the response; it does not prove a trade\./); assert.match(strategySource, /Submitted means the relay accepted the response; it does not prove a trade\./);
assert.doesNotMatch(strategySource, /Actionable|actionable/); assert.doesNotMatch(strategySource, /Actionable|actionable/);
}); });