Files
freemo a41fc02f11
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 14s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 18s
CI / security (pull_request) Successful in 35s
CI / typecheck (pull_request) Successful in 41s
CI / unit_tests (pull_request) Successful in 2m30s
CI / integration_tests (pull_request) Successful in 3m7s
CI / docker (pull_request) Successful in 54s
CI / coverage (pull_request) Successful in 5m42s
CI / lint (push) Successful in 12s
CI / build (push) Successful in 16s
CI / quality (push) Successful in 18s
CI / security (push) Successful in 33s
CI / typecheck (push) Successful in 36s
CI / benchmark-regression (push) Has been skipped
CI / unit_tests (push) Successful in 2m45s
CI / integration_tests (push) Successful in 3m11s
CI / docker (push) Successful in 46s
CI / coverage (push) Successful in 5m52s
CI / benchmark-publish (push) Successful in 17m26s
CI / benchmark-regression (pull_request) Successful in 31m25s
feat(acms): add strategy coordinator and fusion engine
Implement StrategyCoordinator and FusionEngine as named facades over
the existing ACMS pipeline components, providing clean public APIs
for parallel strategy execution with proportional budget allocation
and fragment fusion with dedup/conflict resolution/knapsack packing.

Key changes:
- Add StrategyCoordinator with parallel execution and confidence-based budget allocation
- Add FusionEngine with URI+hash dedup, max-depth conflict resolution, greedy knapsack packing
- Add budget overage guard with lowest-relevance fragment dropping
- Add per-strategy max caps enforcement
- Wire into existing ContextAssemblyPipeline
- Add Behave BDD tests, Robot integration tests, ASV benchmarks
- Add docs/reference/acms_fusion.md

ISSUES CLOSED: #192
2026-03-10 15:09:03 +00:00

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