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
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
7.2 KiB
7.2 KiB
ACMS Strategy Coordinator & Fusion Engine
Overview
The StrategyCoordinator and FusionEngine are named facades that provide clean public APIs over the existing ACMS pipeline Phase 1 and Phase 2 components respectively.
Architecture
┌─────────────────────────────────────────────────────────┐
│ StrategyCoordinator │
│ ┌─────────────────┐ ┌──────────────────┐ ┌──────────┐ │
│ │ Confidence │ │ Proportional │ │ Parallel │ │
│ │ Weighted │ │ Budget │ │ Strategy │ │
│ │ Selector │ │ Allocator │ │ Executor │ │
│ └────────┬────────┘ └────────┬─────────┘ └────┬─────┘ │
│ │ select │ allocate │execute │
│ └───────────────────┴─────────────────┘ │
│ coordinate() │
└─────────────────────────┬───────────────────────────────┘
│ fragments
▼
┌─────────────────────────────────────────────────────────┐
│ FusionEngine │
│ ┌──────────┐ ┌───────────┐ ┌─────────┐ ┌───────────┐ │
│ │ Content │ │ Max Depth │ │Weighted │ │ Greedy │ │
│ │ Hash │ │ Resolver │ │Composite│ │ Knapsack │ │
│ │ Dedup │ │ │ │ Scorer │ │ Packer │ │
│ └────┬─────┘ └─────┬─────┘ └────┬────┘ └─────┬─────┘ │
│ │ dedup │ resolve │ score │ pack │
│ └──────────────┴────────────┴─────────────┘ │
│ fuse() │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Budget Overage Guard │ │
│ │ Drop lowest-relevance fragments if over budget │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
StrategyCoordinator
Public API
coordinator = StrategyCoordinator(config=CoordinatorConfig(
per_strategy_max_cap=500,
min_useful_budget=64,
))
result = coordinator.coordinate(
request={"preferred_strategies": ["relevance"]},
strategies=[strategy_a, strategy_b],
budget=ContextBudget(max_tokens=4096),
fragments=input_fragments,
backends={"vector": True},
plan_context={"plan_id": "..."},
)
# Result: CoordinationResult
# .fragments: list[ContextFragment]
# .strategies_used: list[str]
# .allocations: list[tuple[str, float, int]]
# .circuit_broken: list[str]
Budget Allocation
Budget tokens are allocated proportionally by strategy confidence:
- Strategy with confidence 0.8 in a pool of (0.8 + 0.2) = 1.0 receives 80% of the budget.
- The largest-remainder method ensures no tokens are lost to rounding.
- Strategies whose proportional share falls below
min_useful_budgetare excluded and their tokens are redistributed.
Per-Strategy Max Caps
When per_strategy_max_cap is set:
- Any allocation exceeding the cap is clamped.
- Excess tokens are redistributed proportionally among uncapped strategies.
- Redistributed tokens are also capped to prevent cascading overflows.
Error Handling
- Circuit breaker: After
circuit_breaker_thresholdconsecutive failures, a strategy is temporarily disabled. Disabled strategies appear inresult.circuit_broken. - Timeouts: Per-strategy execution timeout of
executor_timeoutseconds. Timed-out strategies are treated as failures. - Graceful degradation: Failed strategies are excluded from results without failing the entire coordination round.
FusionEngine
Public API
engine = FusionEngine(config=FusionConfig(
overage_guard_enabled=True,
min_fragment_tokens=10,
))
result = engine.fuse(
fragments=coordinator_output.fragments,
budget=ContextBudget(max_tokens=4096),
)
# Result: FusionResult
# .fragments: list[ContextFragment]
# .dedup_count: int
# .depth_resolved_count: int
# .dropped_by_overage_guard: int
# .total_tokens: int
# .budget_utilization: float
Fragment Dedup
Fragments are grouped by (UKO URI, SHA-256 hash of content).
Within each group, the fragment with the highest relevance_score
is retained.
Detail Conflict Resolution
When the same UKO node appears at multiple detail depths:
- The highest-depth rendering is retained.
- Equal depths: prefer higher
relevance_score.
Greedy Knapsack Packing
Fragments are sorted with deterministic tie-breakers:
relevance_scoredescendingdetail_depthdescendingtoken_countascending
The greedy algorithm fills the budget top-down. When a high-value fragment doesn't fit, depth fallback attempts lower-depth renderings of the same UKO node.
Budget Overage Guard
A post-packing safety net that:
- Checks if total tokens exceed the available budget.
- Drops fragments in ascending order of
relevance_score. - Emits structured
WARNINGlog messages for each dropped fragment. - Continues until total tokens fit within budget.
Configuration Reference
CoordinatorConfig
| Field | Type | Default | Description |
|---|---|---|---|
min_useful_budget |
int |
64 | Min tokens per strategy |
executor_timeout |
float |
30.0 | Per-strategy timeout (seconds) |
executor_max_workers |
int |
4 | Max concurrent threads |
circuit_breaker_threshold |
int |
3 | Failures before circuit opens |
preference_boost |
float |
1.5 | Confidence multiplier for preferred |
per_strategy_max_cap |
int | None |
None | Max tokens per strategy |
FusionConfig
| Field | Type | Default | Description |
|---|---|---|---|
scorer_weights |
ScorerWeights | None |
None | Composite scoring weights |
depth_fallback_steps |
tuple[int, ...] |
(9,4,2,0) | Depth fallback sequence |
min_fragment_tokens |
int |
10 | Min tokens for packing |
overage_guard_enabled |
bool |
True | Enable budget overage guard |