cupel 1.2.0

Context window management pipeline for LLM applications
[test]
name = "QuotaSlice: require and cap constraints distribute budget"
stage = "slicing"
slicer = "quota"

# Budget: 1000 tokens.
# Quotas:
#   SystemPrompt: require=30%, cap=50%
#   Message: require=0%, cap=40%
# (Document has no quota → require=0%, cap=100%)
#
# Items:
#   sys-a: kind=SystemPrompt, tokens=200, score=0.9
#   sys-b: kind=SystemPrompt, tokens=200, score=0.5
#   msg-a: kind=Message, tokens=300, score=0.8
#   msg-b: kind=Message, tokens=300, score=0.3
#   doc-a: kind=Document, tokens=200, score=0.7
#
# requireTokens: SystemPrompt=floor(0.3*1000)=300, Message=0
# capTokens: SystemPrompt=floor(0.5*1000)=500, Message=floor(0.4*1000)=400
# totalRequired = 300
# unassigned = 1000 - 300 = 700
#
# candidateTokenMass:
#   SystemPrompt: 200+200=400 (cap > require, so participates)
#   Message: 300+300=600 (cap=400 > require=0, participates)
#   Document: 200 (cap=1000 > require=0, participates)
# totalMassForDistribution = 400+600+200 = 1200
#
# kindBudgets:
#   SystemPrompt: require(300) + floor(700*400/1200)=floor(233.33)=233 = 533
#     cap = 500, so clamped to 500
#   Message: require(0) + floor(700*600/1200)=floor(350)=350 = 350
#     cap = 400, within cap → 350
#   Document: require(0) + floor(700*200/1200)=floor(116.67)=116 = 116
#     cap = 1000, within cap → 116
#
# Inner slicer (greedy) per kind:
#   SystemPrompt (budget=500): sys-a(density=0.9/200=0.0045), sys-b(0.5/200=0.0025)
#     Fill: sys-a(remaining=300), sys-b(remaining=100). Both fit.
#   Message (budget=350): msg-a(density=0.8/300≈0.00267), msg-b(0.3/300=0.001)
#     Fill: msg-a(remaining=50), msg-b(300>50 skip). Only msg-a.
#   Document (budget=116): doc-a(tokens=200>116 → skip). None selected.
#
# Selected: sys-a, sys-b, msg-a

[config]
inner_slicer = "greedy"

[[config.quotas]]
kind = "SystemPrompt"
require = 30.0
cap = 50.0

[[config.quotas]]
kind = "Message"
require = 0.0
cap = 40.0

[budget]
target_tokens = 1000

[[scored_items]]
content = "sys-a"
tokens = 200
score = 0.9
kind = "SystemPrompt"

[[scored_items]]
content = "sys-b"
tokens = 200
score = 0.5
kind = "SystemPrompt"

[[scored_items]]
content = "msg-a"
tokens = 300
score = 0.8
kind = "Message"

[[scored_items]]
content = "msg-b"
tokens = 300
score = 0.3
kind = "Message"

[[scored_items]]
content = "doc-a"
tokens = 200
score = 0.7
kind = "Document"

[expected]
selected_contents = ["sys-a", "sys-b", "msg-a"]