forked from cleveragents/cleveragents-core
169 lines
7.9 KiB
Gherkin
169 lines
7.9 KiB
Gherkin
@acms @acms_fusion
|
|
Feature: ACMS Strategy Coordinator and Fusion Engine
|
|
As a CleverAgents developer
|
|
I want named facades for strategy coordination and fragment fusion
|
|
So that the ACMS pipeline has clean public APIs for parallel strategy
|
|
execution with proportional budget allocation and fragment fusion
|
|
with dedup, conflict resolution, and knapsack packing
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# StrategyCoordinator — Parallel execution
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @coordinator
|
|
Scenario: StrategyCoordinator coordinates a single strategy
|
|
Given the fusion modules are available
|
|
And fusion test strategies with confidences 0.8 and 0.6
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate with a budget of 200 tokens
|
|
Then the coordination result should contain fragments
|
|
And the coordination result should list strategies used
|
|
|
|
@fusion @coordinator
|
|
Scenario: StrategyCoordinator handles empty strategies list
|
|
Given the fusion modules are available
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate with no strategies and a budget of 200 tokens
|
|
Then the coordination result should contain 0 fragments
|
|
|
|
@fusion @coordinator
|
|
Scenario: StrategyCoordinator reports circuit-broken strategies
|
|
Given the fusion modules are available
|
|
And a coordinator with a pre-broken circuit for "broken_strat"
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate with the circuit-broken strategy
|
|
Then the coordination result should report circuit-broken strategies
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# StrategyCoordinator — Budget allocation proportional to confidence
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @coordinator @budget
|
|
Scenario: StrategyCoordinator allocates budget proportionally
|
|
Given the fusion modules are available
|
|
And fusion test strategies with confidences 0.8 and 0.2
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate with a budget of 1000 tokens
|
|
Then the allocation for the first strategy should be approximately 800
|
|
And the allocation for the second strategy should be approximately 200
|
|
And the total allocation should equal 1000
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# StrategyCoordinator — Per-strategy max caps
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @coordinator @caps
|
|
Scenario: StrategyCoordinator enforces per-strategy max caps
|
|
Given the fusion modules are available
|
|
And a coordinator with per-strategy max cap of 300
|
|
And fusion test strategies with confidences 0.9 and 0.1
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate with a budget of 1000 tokens using the capped coordinator
|
|
Then no strategy allocation should exceed 300 tokens
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# FusionEngine — Dedup by URI + hash
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @engine @dedup
|
|
Scenario: FusionEngine deduplicates by UKO URI and content hash
|
|
Given the fusion modules are available
|
|
And fusion fragments with duplicates by URI and content
|
|
When I fuse with a budget of 500 tokens
|
|
Then the fusion result dedup count should be greater than 0
|
|
And the fusion result should contain fewer fragments than input
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# FusionEngine — Detail conflict resolution
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @engine @depth
|
|
Scenario: FusionEngine resolves detail depth conflicts to max depth
|
|
Given the fusion modules are available
|
|
And fusion fragments with same UKO node at depths 2 and 5
|
|
When I fuse with a budget of 500 tokens
|
|
Then the fusion result should retain the depth 5 fragment
|
|
And the fusion result depth resolved count should be greater than 0
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# FusionEngine — Greedy knapsack packing with tie-breakers
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @engine @packing
|
|
Scenario: FusionEngine packs fragments within budget using greedy knapsack
|
|
Given the fusion modules are available
|
|
And fusion fragments totaling 600 tokens
|
|
When I fuse with a budget of 400 tokens
|
|
Then the fusion result total tokens should be at most 400
|
|
And the fusion result should contain fewer fragments than input
|
|
|
|
@fusion @engine @packing
|
|
Scenario: FusionEngine uses deterministic tie-breakers
|
|
Given the fusion modules are available
|
|
And fusion fragments with equal relevance but different depths
|
|
When I fuse with a budget of 500 tokens
|
|
Then the fusion result fragments should be ordered by depth descending then token count ascending
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# FusionEngine — Budget overage guard
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @engine @overage
|
|
Scenario: FusionEngine budget overage guard drops lowest-relevance fragments
|
|
Given the fusion modules are available
|
|
And a fusion engine with overage guard enabled
|
|
And fusion fragments that cause budget overage
|
|
When I fuse with the overage-prone fragments and a budget of 100 tokens
|
|
Then the fusion result total tokens should be at most 100
|
|
And the fusion result dropped by overage guard should be greater than 0
|
|
|
|
@fusion @engine @overage
|
|
Scenario: FusionEngine overage guard does not drop when within budget
|
|
Given the fusion modules are available
|
|
And a fusion engine with overage guard enabled
|
|
And fusion fragments totaling exactly 100 tokens
|
|
When I fuse with the exact fragments and a budget of 100 tokens
|
|
Then the fusion result dropped by overage guard should be 0
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# FusionEngine — Empty input
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @engine
|
|
Scenario: FusionEngine handles empty input gracefully
|
|
Given the fusion modules are available
|
|
When I fuse with no fragments and a budget of 500 tokens
|
|
Then the fusion result should contain 0 fragments
|
|
And the fusion result input count should be 0
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Integration: Coordinator + FusionEngine
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @integration
|
|
Scenario: StrategyCoordinator output feeds into FusionEngine
|
|
Given the fusion modules are available
|
|
And fusion test strategies with confidences 0.8 and 0.6
|
|
And fusion test fragments with token counts 50 and 50
|
|
When I coordinate then fuse with a budget of 200 tokens
|
|
Then the final fused result should contain fragments within budget
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Configuration
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@fusion @config
|
|
Scenario: CoordinatorConfig defaults are sensible
|
|
Given the fusion modules are available
|
|
When I create a default CoordinatorConfig
|
|
Then the config min_useful_budget should be 64
|
|
And the config executor_timeout should be 30.0
|
|
And the config per_strategy_max_cap should be None
|
|
|
|
@fusion @config
|
|
Scenario: FusionConfig defaults are sensible
|
|
Given the fusion modules are available
|
|
When I create a default FusionConfig
|
|
Then the fusion config overage_guard_enabled should be True
|
|
And the fusion config min_fragment_tokens should be 10
|