Altimate Memory Tools
Altimate Memory gives your data engineering agent persistent, cross-session memory. Instead of re-explaining your warehouse setup, naming conventions, or team preferences every session, the agent remembers what matters and picks up where you left off.
Memory blocks are plain Markdown files stored on disk, making them human-readable, version-controllable, and fully under your control.
Why memory matters for data engineering
General-purpose coding agents treat every session as a blank slate. For data engineering, this is especially painful because:
- Warehouse context is stable. Your Snowflake warehouse name, default database, and connection details rarely change, but you re-explain them every session.
- Naming conventions are tribal knowledge.
stg_for staging,int_for intermediate,fct_/dim_for marts. The agent needs to learn these once, not every time. - Past analyses inform future work. If the agent optimized a query or traced lineage for a table last week, recalling that context avoids redundant work.
- User preferences accumulate. SQL style, preferred dialects, dbt patterns, warehouse sizing decisions.
Altimate Memory solves this with three tools that let the agent save, recall, and manage its own persistent knowledge.
Tools
altimate_memory_read
Read memory blocks from previous sessions. Automatically called at session start to give the agent context.
> Read my memory about warehouse configuration
Memory: 1 block(s)
### warehouse-config (project) [snowflake, warehouse]
## Warehouse Configuration
- **Provider**: Snowflake
- **Default warehouse**: ANALYTICS_WH (XS for dev, M for prod)
- **Default database**: ANALYTICS_DB
- **Naming convention**: stg_ for staging, int_ for intermediate, fct_/dim_ for marts
Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
scope |
"global" \| "project" \| "all" |
"all" |
Filter by scope |
tags |
string[] |
[] |
Filter to blocks containing all specified tags |
id |
string |
(none) | Read a specific block by ID |
altimate_memory_write
Create or update a persistent memory block.
> Remember that our Snowflake warehouse is ANALYTICS_WH and we use stg_ prefix for staging models
Memory: Created "warehouse-config"
The agent automatically calls this when it learns something worth persisting. You can also explicitly ask it to "remember" something.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string |
Yes | Unique identifier (lowercase, hyphens/underscores). Examples: warehouse-config, naming-conventions |
scope |
"global" \| "project" |
Yes | global for user-wide preferences, project for project-specific knowledge |
content |
string |
Yes | Markdown content (max 2,048 characters) |
tags |
string[] |
No | Up to 10 tags for categorization (max 64 chars each) |
altimate_memory_delete
Remove a memory block that is outdated, incorrect, or no longer relevant.
> Forget the old warehouse config, we migrated to BigQuery
Memory: Deleted "warehouse-config"
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string |
Yes | ID of the block to delete |
scope |
"global" \| "project" |
Yes | Scope of the block to delete |
Scoping
Memory blocks live in two scopes:
| Scope | Storage location | Use case |
|---|---|---|
| global | ~/.local/share/altimate-code/memory/ |
User-wide preferences: SQL style, preferred models, general conventions |
| project | .altimate-code/memory/ (in project root) |
Project-specific: warehouse config, naming conventions, data model notes, past analyses |
Project memory travels with your repo. Add .altimate-code/memory/ to .gitignore if it contains sensitive information, or commit it to share team conventions.
File format
Each block is a Markdown file with YAML frontmatter:
---
id: warehouse-config
scope: project
created: 2026-03-14T10:00:00.000Z
updated: 2026-03-14T10:00:00.000Z
tags: ["snowflake", "warehouse"]
---
## Warehouse Configuration
- **Provider**: Snowflake
- **Default warehouse**: ANALYTICS_WH
- **Default database**: ANALYTICS_DB
Files are human-readable and editable. You can create, edit, or delete them manually. The agent will pick up changes on the next session.
Limits and safety
| Limit | Value | Rationale |
|---|---|---|
| Max block size | 2,048 characters | Prevents any single block from consuming too much context |
| Max blocks per scope | 50 | Bounds total memory footprint |
| Max tags per block | 10 | Keeps metadata manageable |
| Max tag length | 64 characters | Prevents tag abuse |
| Max ID length | 256 characters | Reasonable filename length |
Atomic writes
Blocks are written to a temporary file first, then atomically renamed. This prevents corruption if the process is interrupted mid-write.
Disabling memory
Set the environment variable to disable all memory functionality, including tools and automatic injection:
ALTIMATE_DISABLE_MEMORY=true
This is useful for benchmarks, CI pipelines, or any environment where persistent memory should not influence agent behavior. When disabled, memory tools are removed from the tool registry and no memory blocks are injected into the system prompt.
Context window impact
Altimate Memory automatically injects relevant blocks into the system prompt at session start, subject to a configurable token budget (default: 8,000 characters). Blocks are sorted by last-updated timestamp, so the most recently relevant information is loaded first. The agent also has access to memory tools (altimate_memory_read, altimate_memory_write, altimate_memory_delete) to manage blocks on demand during a session.
What this means in practice:
- With a typical block size of 200-500 characters, the default budget comfortably fits 15-40 blocks
- Memory injection adds a one-time cost at session start and does not grow during the session
- If you notice context pressure, reduce the number of blocks or keep them concise
- The agent's own tool calls and responses consume far more context than memory blocks
- To disable injection entirely (e.g., for benchmarks), set
ALTIMATE_DISABLE_MEMORY=true
Tip
Keep blocks concise and focused. A block titled "warehouse-config" with 5 bullet points is better than a wall of text. The agent can always call altimate_memory_read to fetch specific blocks on demand.
Potential side effects and how to handle them
Stale or incorrect memory
Memory blocks persist indefinitely. If your warehouse configuration changes or a convention is updated, the agent will continue using outdated information until the block is updated or deleted.
How to detect: If the agent makes assumptions that don't match your current setup (e.g., references an old warehouse name), check what's in memory:
> Show me all memory blocks
> Delete the warehouse-config block, it's outdated
How to prevent:
- Review memory blocks periodically, since they're plain Markdown files you can inspect directly
- Ask the agent to "forget" outdated information when things change
- Keep blocks focused on stable facts rather than ephemeral details
Wrong information getting saved
The agent decides what to save based on conversation context. It may occasionally save incorrect inferences or overly specific details that don't generalize well.
How to detect:
- After a session where the agent saved memory, review what was written:
ls .altimate-code/memory/ # project memory cat .altimate-code/memory/*.md # inspect all blocks - The agent always reports when it creates or updates a memory block, so watch for
Memory: Created "..."orMemory: Updated "..."messages in the session output
How to fix:
- Delete the bad block: ask the agent or run
rm .altimate-code/memory/bad-block.md - Edit the file directly, since it's just Markdown
- Ask the agent to rewrite it: "Update the warehouse-config memory with the correct warehouse name"
Context bloat
With 50 blocks at 2KB each, the theoretical maximum injection is ~100KB. In practice, the 8,000-character default budget caps injection at well under 10KB.
Signs of context bloat:
- Frequent auto-compaction (visible in the TUI)
- The agent losing track of your current task because memory is crowding out working context
How to mitigate:
- Keep the total block count low (10-20 active blocks is a sweet spot)
- Delete blocks you no longer need
- Use tags to categorize and let the agent filter to what's relevant
- Reduce the injection budget if needed
Security considerations
Memory blocks are stored as plaintext files on disk. Be mindful of what gets saved:
- Do not save credentials, API keys, or connection strings in memory blocks
- Do save structural information (warehouse names, naming conventions, schema patterns)
- If using project-scoped memory in a shared repo, add
.altimate-code/memory/to.gitignoreto avoid committing sensitive context - Memory blocks are scoped per-user (global) and per-project, so there is no cross-user or cross-project leakage
Warning
Memory blocks are not encrypted. Treat them like any other configuration file on your machine. Do not store secrets or PII in memory blocks.
Examples
Data engineering team setup
> Remember: we use Snowflake with warehouse COMPUTE_WH for dev and ANALYTICS_WH for prod.
Our dbt project uses the staging/intermediate/marts pattern with stg_, int_, fct_, dim_ prefixes.
Always use QUALIFY instead of subqueries for deduplication.
Memory: Created "team-conventions" in project scope
Personal SQL preferences
> Remember globally: I prefer CTEs over subqueries, always use explicit column lists
(no SELECT *), and format SQL with lowercase keywords.
Memory: Created "sql-preferences" in global scope
Recalling past work
> What do you remember about our warehouse?
Memory: 2 block(s)
### warehouse-config (project) [snowflake]
...
### team-conventions (project) [dbt, conventions]
...