State Management
Comparable to: Redis, DynamoDB, Memcached
Key Concepts
Use the concepts below when they fit the task. Not every state operation needs all of them.
- State is a scoped key-value store accessed via built-in trigger functions
- state::set writes a value; state::get reads it (returns for missing keys)
- state::list retrieves all keys in a scope; state::delete removes a key
- state::update performs a partial merge using an array for fine-grained changes
- Payloads use , , and to address state entries
- State is shared across all functions — use meaningful scope names to avoid collisions
Architecture
Function
→ trigger('state::set', { scope, key, value })
→ trigger('state::get', { scope, key })
→ trigger('state::update', { scope, key, ops })
→ trigger('state::delete', { scope, key })
→ trigger('state::list', { scope })
→ StateModule → KvStore / Redis adapter
iii Primitives Used
| Primitive | Purpose |
|---|
trigger({ function_id: 'state::set', payload })
| Write a value to state |
trigger({ function_id: 'state::get', payload })
| Read a value from state |
trigger({ function_id: 'state::list', payload })
| List all keys in a scope |
trigger({ function_id: 'state::delete', payload })
| Remove a key from state |
trigger({ function_id: 'state::update', payload: { ops } })
| Partial merge with operations array |
Reference Implementation
See ../references/state-management.js for the full working example — functions that read, write, update, and delete state entries across a shared scope.
Also available in Python: ../references/state-management.py
Also available in Rust: ../references/state-management.rs
Common Patterns
Code using this pattern commonly includes, when relevant:
registerWorker(url, { workerName })
— worker initialization
trigger({ function_id: 'state::set', payload: { scope, key, value } })
— write state
trigger({ function_id: 'state::get', payload: { scope, key } })
— read state (returns if missing)
trigger({ function_id: 'state::update', payload: { scope, key, ops } })
— partial merge
trigger({ function_id: 'state::list', payload: { scope } })
— enumerate keys
trigger({ function_id: 'state::delete', payload: { scope, key } })
— remove entry
const logger = new Logger()
— structured logging
Adapting This Pattern
Use the adaptations below when they apply to the task.
- Name scopes after your domain (e.g. , , )
- Use with a check to handle missing keys gracefully
- Use with for partial updates instead of read-modify-write cycles
- Combine with to persist results after async job completion
Engine Configuration
StateModule must be enabled in iii-config.yaml with a KvStore adapter (file-based or Redis). See ../references/iii-config.yaml for the full annotated config reference.
Pattern Boundaries
- If the task needs reactive side effects when state changes, prefer .
- If the task needs real-time client push when data updates, prefer .
- Stay with when the primary need is reading and writing persistent key-value data.
When to Use
- Use this skill when the task is primarily about in the iii engine.
- Triggers when the request directly asks for this pattern or an equivalent implementation.
Boundaries
- Never use this skill as a generic fallback for unrelated tasks.
- You must not apply this skill when a more specific iii skill is a better fit.
- Always verify environment and safety constraints before applying examples from this skill.