Files
cleveragents-core/features/exec_env_precedence.feature
hamza.khyari 5e96b4bf80
CI / build (pull_request) Successful in 16s
CI / helm (pull_request) Successful in 21s
CI / lint (pull_request) Successful in 3m18s
CI / quality (pull_request) Successful in 3m47s
CI / typecheck (pull_request) Successful in 3m57s
CI / security (pull_request) Successful in 4m6s
CI / benchmark-publish (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 7m6s
CI / unit_tests (pull_request) Successful in 7m18s
CI / docker (pull_request) Successful in 1m19s
CI / coverage (pull_request) Successful in 11m49s
CI / e2e_tests (pull_request) Successful in 20m44s
CI / status-check (pull_request) Successful in 1s
CI / benchmark-regression (pull_request) Successful in 55m9s
feat(resource): implement 6-level execution environment precedence chain
Implement the spec's 6-level execution environment precedence chain
(spec lines 19324-19386):

1. Plan override (priority=override) — always wins
2. Project override (priority=override) — wins over devcontainer
3. Nearest-ancestor devcontainer — auto-discovered
4. Plan fallback (priority=fallback) — defers to devcontainer
5. Project fallback (priority=fallback) — defers to closer scopes
6. Host default — final fallback

- New resolve_with_precedence() API on ExecutionEnvironmentResolver
- Added execution_env_priority field to ContextConfig (project model)
- has_devcontainer() helper for devcontainer-instance detection
- Legacy 4-level resolve() preserved for backward compatibility
- _parse_priority() defaults missing priority to FALLBACK
- 13 new Behave scenarios testing all 6 levels + edge cases
- Updated CHANGELOG

ISSUES CLOSED: #877
2026-03-31 16:01:58 +00:00

85 lines
5.0 KiB
Gherkin

@exec-env-precedence
Feature: 6-level execution environment precedence chain (#877)
Verifies the full 6-level precedence chain: plan override,
project override, nearest-ancestor devcontainer, plan fallback,
project fallback, host default. Also tests DAG walking for
devcontainer discovery and container:// reference parsing.
# 6-Level Precedence Chain
Scenario: Level 1 — plan override wins over everything for precedence
When I resolve precedence with plan_env "container" plan_priority "override" project_env "host" project_priority "override" devcontainer true
Then the precedence resolved environment should be "container"
Scenario: Level 2 — project override wins over devcontainer for precedence
When I resolve precedence with plan_env "host" plan_priority "fallback" project_env "container" project_priority "override" devcontainer false
Then the precedence resolved environment should be "container"
Scenario: Level 3 — devcontainer wins over plan fallback for precedence
When I resolve precedence with plan_env "host" plan_priority "fallback" project_env "host" project_priority "fallback" devcontainer true
Then the precedence resolved environment should be "container"
Scenario: Level 4 — plan fallback used when no devcontainer for precedence
When I resolve precedence with plan_env "container" plan_priority "fallback" project_env "host" project_priority "fallback" devcontainer false
Then the precedence resolved environment should be "container"
Scenario: Level 5 — project fallback used when no plan env for precedence
When I resolve precedence with project_env "container" project_priority "fallback" devcontainer false
Then the precedence resolved environment should be "container"
Scenario: Level 6 — host default when nothing configured for precedence
When I resolve precedence with devcontainer false
Then the precedence resolved environment should be "host"
Scenario: Tool override trumps all 6 levels for precedence
When I resolve precedence with tool_env "host" plan_env "container" plan_priority "override" devcontainer true
Then the precedence resolved environment should be "host"
Scenario: Plan override beats project override for precedence
When I resolve precedence with plan_env "host" plan_priority "override" project_env "container" project_priority "override" devcontainer false
Then the precedence resolved environment should be "host"
Scenario: Project override beats devcontainer for precedence
When I resolve precedence with project_env "host" project_priority "override" devcontainer true
Then the precedence resolved environment should be "host"
Scenario: Default priority is fallback for precedence
When I resolve precedence with plan_env "host" project_env "host" devcontainer true
Then the precedence resolved environment should be "container"
# ── Devcontainer helpers ────────────────────────────────
Scenario: has_devcontainer detects devcontainer-instance for precedence
When I check has_devcontainer with types "git-checkout,devcontainer-instance" for precedence
Then has_devcontainer should be true for precedence
Scenario: has_devcontainer returns false without devcontainer for precedence
When I check has_devcontainer with types "git-checkout,fs-directory" for precedence
Then has_devcontainer should be false for precedence
# ── ContextConfig priority field ────────────────────────
Scenario: ContextConfig supports execution_env_priority field for precedence
When I create a ContextConfig with priority "override" for precedence
Then the context config priority should be "override" for precedence
# ── DAG walk (#877 subtask 2) ───────────────────────────
Scenario: DAG walk finds nearest devcontainer ancestor for precedence
When I resolve with DAG walk from "res-file" with devcontainer ancestor for precedence
Then the precedence resolved environment should be "container"
Scenario: DAG walk returns host when no devcontainer ancestor for precedence
When I resolve with DAG walk from "res-file" without devcontainer ancestor for precedence
Then the precedence resolved environment should be "host"
# ── Container reference (#877 subtask 4) ────────────────
Scenario: Container reference parsed correctly for precedence
When I parse container ref "container://local/my-dc" for precedence
Then the container ref name should be "local/my-dc" for precedence
Scenario: Container reference coerces to CONTAINER_REF for precedence
When I resolve precedence with plan_env "container://local/my-dc" plan_priority "override" project_env "host" project_priority "fallback" devcontainer false
Then the precedence resolved environment should be "container_ref"