Levels
The five named energy levels, their cognitive profiles, and why the scale is fixed.
The energy model has exactly five discrete levels: 100 | 75 | 50 | 25 | 0. Discrete rather than continuous because fewer choices mean less decision fatigue - critical exactly when energy is already low - and because clear boundaries make adaptation rules predictable.
The five levels
| Value | Key | Label | Description |
|---|---|---|---|
100 | peak | Peak | High capacity. Planning, complex decisions, creative work. |
75 | active | Active | Good capacity. Focused execution, problem-solving. |
50 | steady | Steady | Moderate capacity. Routine tasks, familiar work. |
25 | low | Low | Limited capacity. Simple tasks, review, light work. |
0 | rest | Rest | Recovery. Consumption only - reading, reflecting. |
Cycle order is descending, wrapping at the bottom: 100 → 75 → 50 → 25 → 0 → 100.
Cognitive profiles
Each level carries a CognitiveProfile describing what the brain can handle there - not what the sidebar should do. Strategies read this to make informed decisions, and different apps can adapt differently from the same profile.
interface CognitiveProfile {
readonly decisionCapacity: 'high' | 'moderate' | 'low' | 'minimal' | 'none'
readonly focusDuration: 'extended' | 'moderate' | 'short' | 'minimal' | 'none'
readonly taskComplexity: 'complex' | 'moderate' | 'routine' | 'simple' | 'consumption'
readonly interruptionTolerance: 'high' | 'moderate' | 'low' | 'minimal' | 'none'
}| Level | Decisions | Focus | Task complexity | Interruptions |
|---|---|---|---|---|
100 | high | extended | complex | high |
75 | moderate | moderate | moderate | moderate |
50 | low | short | routine | low |
25 | minimal | minimal | simple | minimal |
0 | none | none | consumption | none |
Reading level definitions
import { getEnergyLevels, getEnergyLevel, cycleEnergyLevel, isEnergyLevel } from '@kumbatio/energy-system'
getEnergyLevels() // all five definitions, ordered 100 → 0
getEnergyLevel(50) // { value: 50, key: 'steady', label: 'Steady', description, cognitiveProfile }
cycleEnergyLevel(25) // 0
isEnergyLevel(66) // false - runtime validation for untrusted inputDefinitions are deeply frozen. Use label and description directly in your UI instead of re-inventing level names.
Can I customize the levels?
The scale itself is fixed - the values, keys, labels, and cognitive profiles are part of the package contract and cannot be redefined. This is deliberate: a shared, stable vocabulary is what lets strategies, presence maps, CSS attributes, and different apps interoperate.
What you can customize:
- Behavior per level - write your own adaptation strategy; the built-ins are defaults, not mandates.
- Presentation - the headless
EnergyIndicatorand the level definitions'label/descriptionlet you render levels however fits your product. - External scales - if your existing app uses a different discrete scale (say
100 | 66 | 33 | 0), bridge it withcreateExternalLevelCompatibilityinstead of forking the model.
If the five-level model oversimplifies a real scenario for you, that's exactly the kind of report the project wants - see Contributing.
Energy State
The immutable, revisioned EnergyState object, energy sources, and how concurrent writes reconcile deterministically.
Strategies
The AdaptationStrategy model and the built-in strategies - UI visibility, notifications, task complexity, interaction forgiveness, deferral, autonomy, and demand admission.
