Kumbatio
Core

Strategies

The built-in adaptation strategies and their configuration types

A strategy is a pure (level) -> config mapping implementing AdaptationStrategy. Resolve them directly (strategy.resolve(level)), through the engine (engine.resolve(strategy)), or in React via useStrategy. Each strategy also implements describe(level), returning a human-readable summary.

The package ships seven built-ins. Six are documented on this page:

ExportStrategy nameConfig typeModule
uiVisibilityStrategyui-visibilityUIVisibilityConfigcore
notificationStrategynotificationsNotificationConfigcore
taskComplexityStrategytask-complexityTaskComplexityConfigcore
interactionForgivenessStrategyinteraction-forgivenessInteractionForgivenessConfigcore
deferralStrategydeferralDeferralConfigcore (see Deferral)
autonomyStrategyautonomyAutonomyConfigcore

The seventh, demandAdmissionStrategy, is documented with the inbound-demand policy it belongs to. createPresenceStrategy is a factory rather than a fixed strategy, and lives with Presence.

All resolved configs are frozen. All resolve implementations throw for invalid levels (they validate through getEnergyLevel).

uiVisibilityStrategy

const uiVisibilityStrategy: AdaptationStrategy<UIVisibilityConfig>

Which chrome elements are shown and how prominent they are.

UIVisibilityConfig

Prop

Type

/>

Values per level

LevelsidebartabBarstatusBartoolbarchromeOpacitychromeOpacityHovercontentMaxWidthcontentFontScalereadOnlyCursor
100truetruetruetrue11none1false
75truetruetruetrue0.71none1false
50truetruetruetrue0.4190ch1false
25falsefalsefalsetrue0.1180ch1.05false
0falsefalsefalsefalse0.050.875ch1.1true

The same values are mirrored by applyEnergyLevel as CSS custom properties and by the reference stylesheet.

notificationStrategy

const notificationStrategy: AdaptationStrategy<NotificationConfig>

Which notification channels are allowed and how aggressively intents are filtered. Enforced at runtime by the notification gate.

NotificationConfig

Prop

Type

/>

Values per level

LevelallowVisualallowSoundallowVibrationbatchIntervalpriorityThreshold
100truetruetrue0all
75truetruefalse0all
50truefalsefalse300000 (5 min)high
25truefalsefalse900000 (15 min)critical
0falsefalsefalse0none

taskComplexityStrategy

const taskComplexityStrategy: AdaptationStrategy<TaskComplexityConfig>

Which tasks to surface and whether to nudge breaks.

TaskComplexityConfig

Prop

Type

/>

Values per level

LevelmaxComplexitysuggestBreaksbreakIntervalMinutes
100complexfalse0
75moderatefalse0
50routinetrue45
25simpletrue25
0consumptionfalse0

Rest (0) is already a break: prompting someone at 0 to take a break from resting is noise, so break suggestions are disabled entirely.

interactionForgivenessStrategy

const interactionForgivenessStrategy: AdaptationStrategy<InteractionForgivenessConfig>

How much room the interface gives the user to notice and reverse mistakes. Lower energy means slower error detection, so forgiveness scales inversely with capacity: longer undo windows, confirmation on destructive actions, more frequent autosave.

InteractionForgivenessConfig

Prop

Type

/>

Values per level

LevelundoWindowMsconfirmDestructiveautosaveIntervalMs
1005000false60000
758000false45000
5010000true30000
2515000true20000
020000true15000

deferralStrategy

const deferralStrategy: AdaptationStrategy<DeferralConfig>

Orders deferral presets so the default "not now" suggestion matches current capacity. Documented with its config and per-level values on the Deferral page.

autonomyStrategy

const autonomyStrategy: AdaptationStrategy<AutonomyConfig>

How much latitude automation has to act for the user without asking.

The mirror of interactionForgivenessStrategy: forgiveness protects against the user's mistakes at low energy, autonomy against the agent's. The system acts on the user's behalf precisely when they are least able to supervise it, so the worst day is the wrong day for it to improvise.

What narrows as energy falls is discretion, not action. At rest the threshold is 1, admitting only certainty - rule-based decisions, never a judgment call - and one unattended step. Automation may still take a single, certain, template-only action, which is exactly the shape of an out-of-office reply; it may not chain steps or compose wording.

AutonomyConfig

Prop

Type

/>

Values per level

LevelconfidenceThresholdallowGeneratedContentmaxUnattendedSteps
1000.6true8
750.7true5
500.8true3
250.9false1
01false1
const { confidenceThreshold, allowGeneratedContent, maxUnattendedSteps } =
  engine.resolve(autonomyStrategy)

if (classification.confidence < confidenceThreshold) return askTheUser()

Useful to any consumer with agentic surfaces, with or without demand admission.

Custom strategies

Any object satisfying AdaptationStrategy<TConfig> works with engine.resolve and useStrategy. For presence-shaped strategies, use createPresenceStrategy.