fix: Fix e2e test JSON field parsing errors
CI / push-validation (pull_request) Failing after 23s
CI / lint (pull_request) Successful in 29s
CI / quality (pull_request) Successful in 36s
CI / helm (pull_request) Successful in 34s
CI / build (pull_request) Successful in 37s
CI / typecheck (pull_request) Successful in 1m1s
CI / security (pull_request) Successful in 1m2s
CI / coverage (pull_request) Failing after 3m17s
CI / e2e_tests (pull_request) Failing after 5m10s
CI / integration_tests (pull_request) Failing after 22m41s
CI / unit_tests (pull_request) Has been cancelled
CI / status-check (pull_request) Has been cancelled
CI / benchmark-publish (pull_request) Has been cancelled
CI / docker (pull_request) Has been cancelled
CI / benchmark-regression (pull_request) Has been cancelled

Fixed multiple issues in e2e tests related to JSON parsing:

1. Fixed doubled 'Safe Parse Json Field With Nested Support With Nested Support'
   that occurred from previous find-replace operation

2. Updated all field accesses to use 'data.' prefix for the new JSON structure:
   - config get commands now use data.value
   - plan status fields now use data.phase, data.processing_state, etc.
   - automation_profile accesses now use data.automation_profile

3. Fixed WF04 tree parsing to extract data field before counting decision nodes

The remaining test failures (WF18 container-instance command) appear to be
functional issues not related to JSON parsing.
This commit is contained in:
2026-04-06 01:41:57 +00:00
parent d086f6a85e
commit 2cdd2fc4d2
6 changed files with 45 additions and 43 deletions
+15 -15
View File
@@ -62,7 +62,7 @@ Plan Lifecycle Assertions
[Documentation] Assert plan lifecycle output after successful plan use.
[Arguments] ${plan_use}
Output Should Contain ${plan_use} plan_id
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${plan_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not parse plan_id from plan use output
Verify Plan In List ${plan_id}
@@ -82,7 +82,7 @@ Guard Enforcement Assertions
[Arguments] ${plan_use} ${expected_profile}=manual
Output Should Contain ${plan_use} plan_id
# Verify the resolved automation profile matches expectation (P2-24)
${resolved_profile}= Safe Parse Json Field With Nested Support ${plan_use.stdout} automation_profile
${resolved_profile}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.automation_profile
IF '${resolved_profile}' != ''
Should Be Equal As Strings ${resolved_profile} ${expected_profile}
END
@@ -102,7 +102,7 @@ Full Flow Apply Step
IF ${apply.rc} == 0
Output Should Contain ${apply} ${plan_id}
# Verify the plan actually transitioned — check for apply-phase indicators
${apply_phase}= Safe Parse Json Field With Nested Support ${apply.stdout} phase
${apply_phase}= Safe Parse Json Field With Nested Support ${apply.stdout} data.phase
IF '${apply_phase}' != ''
Should Contain ${apply_phase.lower()} apply Plan phase should indicate apply after apply
END
@@ -121,7 +121,7 @@ M6 E2E Session Lifecycle
Should Not Be Empty ${create.stdout}
Output Should Contain ${create} session_id
# Parse session_id from JSON output (handle potential leading non-JSON output)
${session_id}= Safe Parse Json Field With Nested Support With Nested Support ${create.stdout} data.session_id
${session_id}= Safe Parse Json Field With Nested Support ${create.stdout} data.session_id
Set Test Variable ${session_id}
Should Not Be Empty ${session_id}
# List sessions — should include the new one
@@ -178,7 +178,7 @@ M6 E2E Config Automation Profile
# Get and verify via JSON — parse the value field for precise assertion
${get_result}= Run CleverAgents Command config get core.automation-profile --format json
Should Be Equal As Integers ${get_result.rc} 0
${config_value}= Safe Parse Json Field With Nested Support ${get_result.stdout} value
${config_value}= Safe Parse Json Field With Nested Support ${get_result.stdout} data.value
Should Be Equal As Strings ${config_value} ci
# Reset to default (manual) is handled by [Teardown].
@@ -296,7 +296,7 @@ M6 E2E Profile Precedence Plan Overrides Global
${set_global}= Run CleverAgents Command config set core.automation-profile review --format json
Should Be Equal As Integers ${set_global.rc} 0
${get_global}= Run CleverAgents Command config get core.automation-profile --format json
${global_value}= Safe Parse Json Field With Nested Support ${get_global.stdout} value
${global_value}= Safe Parse Json Field With Nested Support ${get_global.stdout} data.value
Should Be Equal As Strings ${global_value} review
# Setup resources and project
${proj_name}= Setup Plan Test Resources prec
@@ -306,7 +306,7 @@ M6 E2E Profile Precedence Plan Overrides Global
Should Be Equal As Integers ${plan_use.rc} 0
... plan use failed (rc=${plan_use.rc}): ${plan_use.stderr}
# Parse automation_profile from plan output: must be "trusted", NOT "review"
${resolved_profile}= Safe Parse Json Field With Nested Support ${plan_use.stdout} automation_profile
${resolved_profile}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.automation_profile
IF '${resolved_profile}' != ''
Should Be Equal As Strings ${resolved_profile} trusted
Should Not Be Equal As Strings ${resolved_profile} review
@@ -332,7 +332,7 @@ M6 E2E Event Queue Via Plan Lifecycle Transitions
# P0-2: Fail (not Skip) when API keys are present but plan use fails.
Should Be Equal As Integers ${plan_use.rc} 0
... plan use failed (rc=${plan_use.rc}): ${plan_use.stderr}
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${plan_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not parse plan_id from plan use output
# 2. Verify plan appears in list (proves creation event was processed)
Verify Plan In List ${plan_id}
@@ -340,8 +340,8 @@ M6 E2E Event Queue Via Plan Lifecycle Transitions
${status1}= Run CleverAgents Command plan status ${plan_id} --format json expected_rc=None timeout=120s
Should Be Equal As Integers ${status1.rc} 0
... plan status failed (rc=${status1.rc}): ${status1.stderr}
${initial_phase}= Safe Parse Json Field With Nested Support ${status1.stdout} phase
${initial_state}= Safe Parse Json Field With Nested Support ${status1.stdout} processing_state
${initial_phase}= Safe Parse Json Field With Nested Support ${status1.stdout} data.phase
${initial_state}= Safe Parse Json Field With Nested Support ${status1.stdout} data.processing_state
Log Initial phase=${initial_phase} processing_state=${initial_state}
# 4. Execute plan — triggers PHASE_TRANSITION and execution events
${execute}= Run CleverAgents Command plan execute ${plan_id} --format json expected_rc=None timeout=180s
@@ -353,8 +353,8 @@ M6 E2E Event Queue Via Plan Lifecycle Transitions
${status2}= Run CleverAgents Command plan status ${plan_id} --format json expected_rc=None timeout=120s
Should Be Equal As Integers ${status2.rc} 0
... plan status failed after execute (rc=${status2.rc}): ${status2.stderr}
${post_phase}= Safe Parse Json Field With Nested Support ${status2.stdout} phase
${post_state}= Safe Parse Json Field With Nested Support ${status2.stdout} processing_state
${post_phase}= Safe Parse Json Field With Nested Support ${status2.stdout} data.phase
${post_state}= Safe Parse Json Field With Nested Support ${status2.stdout} data.processing_state
Log Post-execute phase=${post_phase} processing_state=${post_state}
# P0-3: Hard assertion — at least one state field must be populated,
# proving the event bus delivered and processed lifecycle events.
@@ -383,7 +383,7 @@ M6 E2E Hierarchical Decomposition Via Plan Tree
# P0-2: Fail (not Skip) when API keys are present but plan use fails.
Should Be Equal As Integers ${plan_use.rc} 0
... plan use failed (rc=${plan_use.rc}): ${plan_use.stderr}
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${plan_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not parse plan_id from plan use output
# Execute plan to populate the decision tree with strategy/execution decisions
${execute}= Run CleverAgents Command plan execute ${plan_id} --format json expected_rc=None timeout=180s
@@ -418,7 +418,7 @@ M6 E2E Full Autonomy Acceptance Flow
Should Be Equal As Integers ${plan_use.rc} 0
... plan use failed (rc=${plan_use.rc}): ${plan_use.stderr}
# Parse plan_id from JSON output
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${plan_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${plan_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not parse plan_id from plan use output
# Check plan status
${status}= Run CleverAgents Command plan status ${plan_id} --format json expected_rc=None timeout=120s
@@ -430,7 +430,7 @@ M6 E2E Full Autonomy Acceptance Flow
IF ${execute.rc} == 0
Output Should Contain ${execute} ${plan_id}
# Verify execute output contains phase-transition indicators
${exec_phase}= Safe Parse Json Field With Nested Support ${execute.stdout} phase
${exec_phase}= Safe Parse Json Field With Nested Support ${execute.stdout} data.phase
Log Execute phase: ${exec_phase}
# Apply
Full Flow Apply Step ${plan_id}
+4 -2
View File
@@ -432,7 +432,8 @@ WF04 Multi Project Dependency Update Supervised Profile
# Parse tree for child plan / decision structure
${tree_payload}= Parse Json Payload ${r_tree.stdout}
${decision_count}= Count Decision Nodes ${tree_payload}
${tree_data}= Set Variable ${tree_payload}[data]
${decision_count}= Count Decision Nodes ${tree_data}
Log Decision tree contains ${decision_count} decision node(s)
Should Be True ${decision_count} >= 1
... Plan tree should contain at least one decision node after strategize (found ${decision_count})
@@ -472,7 +473,8 @@ WF04 Multi Project Dependency Update Supervised Profile
Should Not Contain ${r_tree_post.stdout}${r_tree_post.stderr} Traceback
Should Not Contain ${r_tree_post.stdout}${r_tree_post.stderr} INTERNAL
${tree_post_payload}= Parse Json Payload ${r_tree_post.stdout}
${post_exec_decision_count}= Count Decision Nodes ${tree_post_payload}
${tree_post_data}= Set Variable ${tree_post_payload}[data]
${post_exec_decision_count}= Count Decision Nodes ${tree_post_data}
Log Post-execute decision tree contains ${post_exec_decision_count} decision node(s)
# Require non-trivial tree depth after execute. Subplan spawning is
# asserted deterministically via internal snapshot checks above.
+7 -7
View File
@@ -324,13 +324,13 @@ WF05 Database Schema Migration With Safety Nets Review Profile
... plan use failed (rc=${r_use.rc}): ${r_use.stderr}
Should Not Contain ${r_use.stdout}${r_use.stderr} Traceback
Should Not Contain ${r_use.stdout}${r_use.stderr} INTERNAL
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${r_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${r_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not extract plan_id from plan use output
Set Test Variable ${WF05_PLAN_ID} ${plan_id}
Log Plan ID: ${plan_id}
# Verify review automation profile was applied.
# If plan use output omits automation_profile, fall back to plan status.
${resolved_profile}= Safe Parse Json Field With Nested Support ${r_use.stdout} automation_profile
${resolved_profile}= Safe Parse Json Field With Nested Support ${r_use.stdout} data.automation_profile
${resolved_profile}= Set Variable If $resolved_profile is None ${EMPTY} ${resolved_profile}
${resolved_profile}= Set Variable If '${resolved_profile}' == 'None' ${EMPTY} ${resolved_profile}
IF '${resolved_profile}' == ''
@@ -341,7 +341,7 @@ WF05 Database Schema Migration With Safety Nets Review Profile
... plan status for profile verification failed (rc=${r_profile_status.rc}): ${r_profile_status.stderr}
Should Not Contain ${r_profile_status.stdout}${r_profile_status.stderr} Traceback
Should Not Contain ${r_profile_status.stdout}${r_profile_status.stderr} INTERNAL
${resolved_profile}= Safe Parse Json Field With Nested Support With Nested Support ${r_profile_status.stdout} automation_profile
${resolved_profile}= Safe Parse Json Field With Nested Support ${r_profile_status.stdout} data.automation_profile
${resolved_profile}= Set Variable If $resolved_profile is None ${EMPTY} ${resolved_profile}
${resolved_profile}= Set Variable If '${resolved_profile}' == 'None' ${EMPTY} ${resolved_profile}
END
@@ -416,11 +416,11 @@ WF05 Database Schema Migration With Safety Nets Review Profile
Should Not Be Empty ${r_status.stdout}
Output Should Contain ${r_status} ${plan_id}
# Assert phase field is populated after execute
${status_phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} phase
${status_phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.phase
Should Not Be Empty ${status_phase} Plan phase should be populated after execute
Log Plan phase after execute: ${status_phase}
# Extract checkpoint ID if available (for rollback attempt)
${checkpoint_id}= Safe Parse Json Field With Nested Support ${r_status.stdout} last_checkpoint_id
${checkpoint_id}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.last_checkpoint_id
# Guard against Python None being returned as string "None" from JSON null
${checkpoint_id}= Set Variable If $checkpoint_id is None ${EMPTY} ${checkpoint_id}
${checkpoint_id}= Set Variable If '${checkpoint_id}' == 'None' ${EMPTY} ${checkpoint_id}
@@ -510,8 +510,8 @@ WF05 Database Schema Migration With Safety Nets Review Profile
... plan status after apply failed (rc=${r_status_after_apply.rc}): ${r_status_after_apply.stderr}
Should Not Contain ${r_status_after_apply.stdout}${r_status_after_apply.stderr} Traceback
Should Not Contain ${r_status_after_apply.stdout}${r_status_after_apply.stderr} INTERNAL
${apply_phase}= Safe Parse Json Field With Nested Support ${r_status_after_apply.stdout} phase
${apply_state}= Safe Parse Json Field With Nested Support ${r_status_after_apply.stdout} processing_state
${apply_phase}= Safe Parse Json Field With Nested Support ${r_status_after_apply.stdout} data.phase
${apply_state}= Safe Parse Json Field With Nested Support ${r_status_after_apply.stdout} data.processing_state
Should Not Be Empty ${apply_phase} plan status after apply should include phase
Should Not Be Empty ${apply_state} plan status after apply should include processing_state
${apply_phase_lower}= Evaluate ($apply_phase).lower()
+2 -2
View File
@@ -210,7 +210,7 @@ WF07 E2E CI Plan Launch
... expected_rc=None timeout=180s
# Parse and validate JSON output
${stdout}= Set Variable ${plan_result.stdout}
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${stdout} data.plan_id
IF '${plan_id}' != '${EMPTY}'
Log Plan launched with ID: ${plan_id}
# Drive the plan through its lifecycle. Per the specification
@@ -328,7 +328,7 @@ Poll Plan Until Terminal
FOR ${i} IN RANGE ${max_polls}
${result}= Run CleverAgents Command plan status ${plan_id}
... --format json expected_rc=None
${state}= Safe Parse Json Field With Nested Support ${result.stdout} state
${state}= Safe Parse Json Field With Nested Support ${result.stdout} data.state
IF '${state}' in ['applied', 'constrained', 'cancelled', 'errored']
RETURN ${state}
END
+10 -10
View File
@@ -223,7 +223,7 @@ WF12 Large Scale Hierarchical Feature Implementation
Should Not Contain ${r_use.stdout}${r_use.stderr} Traceback
Should Not Contain ${r_use.stdout}${r_use.stderr} INTERNAL
Output Should Contain ${r_use} plan_id
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${r_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${r_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} Could not parse plan_id from plan use output
Log Plan ID: ${plan_id}
@@ -300,8 +300,8 @@ WF12 Large Scale Hierarchical Feature Implementation
... expected_rc=None timeout=60s
Should Be Equal As Integers ${r_mid_status.rc} 0
... Intermediate plan status failed (rc=${r_mid_status.rc}): ${r_mid_status.stderr}
${mid_phase}= Safe Parse Json Field With Nested Support ${r_mid_status.stdout} phase
${mid_state}= Safe Parse Json Field With Nested Support ${r_mid_status.stdout} processing_state
${mid_phase}= Safe Parse Json Field With Nested Support ${r_mid_status.stdout} data.phase
${mid_state}= Safe Parse Json Field With Nested Support ${r_mid_status.stdout} data.processing_state
Log Post-strategize status: phase=${mid_phase} processing_state=${mid_state}
# Assert plan state progressed — at least one field should be non-empty after strategize (M3 fix)
${mid_populated}= Evaluate '${mid_phase}' != '' or '${mid_state}' != ''
@@ -330,8 +330,8 @@ WF12 Large Scale Hierarchical Feature Implementation
... expected_rc=None timeout=60s
Should Be Equal As Integers ${r_pre_correct_status.rc} 0
... Pre-correction plan status failed (rc=${r_pre_correct_status.rc}): ${r_pre_correct_status.stderr}
${pre_correct_phase}= Safe Parse Json Field With Nested Support ${r_pre_correct_status.stdout} phase
${pre_correct_state}= Safe Parse Json Field With Nested Support ${r_pre_correct_status.stdout} processing_state
${pre_correct_phase}= Safe Parse Json Field With Nested Support ${r_pre_correct_status.stdout} data.phase
${pre_correct_state}= Safe Parse Json Field With Nested Support ${r_pre_correct_status.stdout} data.processing_state
Log Pre-correction status: phase=${pre_correct_phase} state=${pre_correct_state}
# Gate correction on pre-correction status: if plan is already in a terminal
# processing state, correction may fail — skip with WARN (m4 fix).
@@ -373,8 +373,8 @@ WF12 Large Scale Hierarchical Feature Implementation
Should Be True ${has_correction_indicator}
... Correction output should acknowledge append mode (found none of: append, queued, mode+append)
# Structural check: parse the correction response and verify a status field exists
${correction_status}= Safe Parse Json Field With Nested Support ${r_correct.stdout} status
${correction_id_field}= Safe Parse Json Field With Nested Support ${r_correct.stdout} correction_id
${correction_status}= Safe Parse Json Field With Nested Support ${r_correct.stdout} data.status
${correction_id_field}= Safe Parse Json Field With Nested Support ${r_correct.stdout} data.correction_id
# At least one structural field should be populated in the correction response
${has_structural_field}= Evaluate '${correction_status}' != '' or '${correction_id_field}' != ''
Should Be True ${has_structural_field}
@@ -422,7 +422,7 @@ WF12 Large Scale Hierarchical Feature Implementation
Should Not Contain ${r_apply.stdout}${r_apply.stderr} INTERNAL
Output Should Contain ${r_apply} ${plan_id}
# Assert apply phase (consistent with m6_acceptance Full Flow Apply Step)
${apply_phase}= Safe Parse Json Field With Nested Support ${r_apply.stdout} phase
${apply_phase}= Safe Parse Json Field With Nested Support ${r_apply.stdout} data.phase
IF '${apply_phase}' != ''
Should Contain ${apply_phase.lower()} apply
... Plan phase should indicate apply after apply
@@ -451,8 +451,8 @@ WF12 Large Scale Hierarchical Feature Implementation
Should Not Be Empty ${r_status.stdout}
Output Should Contain ${r_status} ${plan_id}
# Parse and verify plan is in a terminal state (not intermediate)
${phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} phase
${state}= Safe Parse Json Field With Nested Support ${r_status.stdout} processing_state
${phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.phase
${state}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.processing_state
Log Final phase=${phase} processing_state=${state}
# At least one field must be non-empty
${state_populated}= Evaluate '${phase}' != '' or '${state}' != ''
+7 -7
View File
@@ -146,7 +146,7 @@ WF17 Explicit Container With Directory Mount Trusted Profile
... project context show ${PROJECT_NAME} --format json
... expected_rc=None
IF ${r_ctx_show.rc} == 0
${persisted_env}= Safe Parse Json Field With Nested Support ${r_ctx_show.stdout} execution_environment
${persisted_env}= Safe Parse Json Field With Nested Support ${r_ctx_show.stdout} data.execution_environment
IF "${persisted_env}" != ""
Should Be Equal As Strings ${persisted_env.lower()} container
... Execution environment should be persisted as 'container' but got '${persisted_env}'
@@ -190,7 +190,7 @@ WF17 Explicit Container With Directory Mount Trusted Profile
... --format json
Should Not Contain ${r_use.stdout}${r_use.stderr} Traceback
Should Not Contain ${r_use.stdout}${r_use.stderr} INTERNAL
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${r_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${r_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} msg=Expected plan_id in plan use JSON output
Should Match Regexp ${plan_id} ^[0-9A-HJKMNP-TV-Z]{26}$
... Plan ID should be a valid Crockford Base32 ULID: ${plan_id}
@@ -281,8 +281,8 @@ WF17 Explicit Container With Directory Mount Trusted Profile
# After full lifecycle (strategize → execute → diff → apply → status),
# the plan should have reached an apply-related phase, matching M6's
# Full Flow Apply Step pattern.
${final_phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} phase
${final_state}= Safe Parse Json Field With Nested Support ${r_status.stdout} processing_state
${final_phase}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.phase
${final_state}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.processing_state
Should Not Be Empty ${final_phase} Plan phase should be populated after full lifecycle
Should Contain ${final_phase.lower()} apply
... Plan should reach apply phase after apply (got: ${final_phase})
@@ -297,7 +297,7 @@ WF17 Explicit Container With Directory Mount Trusted Profile
# NOTE: Container routing verification gap is not yet tracked in a dedicated
# issue. A tracking issue should be created to cover CLI-level routing
# indicators for container execution.
${exec_env}= Safe Parse Json Field With Nested Support ${r_status.stdout} execution_environment
${exec_env}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.execution_environment
IF "${exec_env}" != ""
Should Be Equal As Strings ${exec_env.lower()} container
... Execution environment should be 'container' but got '${exec_env}'
@@ -434,7 +434,7 @@ WF17 TDD Precedence Level 2 Project Override Resolution
IF ${r_use.rc} != 0
Fail plan use failed (rc=${r_use.rc}) — cannot verify precedence level 2: ${r_use.stderr}
END
${plan_id}= Safe Parse Json Field With Nested Support With Nested Support ${r_use.stdout} data.plan_id
${plan_id}= Safe Parse Json Field With Nested Support ${r_use.stdout} data.plan_id
Should Not Be Empty ${plan_id} msg=Expected plan_id in plan use output
# Check plan status for execution environment resolution.
@@ -444,6 +444,6 @@ WF17 TDD Precedence Level 2 Project Override Resolution
Should Be Equal As Integers ${r_status.rc} 0
# The plan should show execution_environment=container resolved via
# project-level override (precedence level 2), not plan-level.
${exec_env}= Safe Parse Json Field With Nested Support ${r_status.stdout} execution_environment
${exec_env}= Safe Parse Json Field With Nested Support ${r_status.stdout} data.execution_environment
Should Be Equal As Strings ${exec_env.lower()} container
... Execution environment should resolve to container via project-level override (precedence level 2, bug #1080)