opencrabs 0.3.80

The autonomous, self-improving AI agent. Single Rust binary. Every channel. Recommended: the 40MB prebuilt binary for macOS, Linux and Windows: https://github.com/adolfousier/opencrabs/releases
# MEMORY.md

Synthetic memory corpus for recall evaluation. Every entry is invented. No real
person, workspace, host or conversation appears here.

## Build commands

Use the linter with all features enabled, never the plain check or build
commands. Formatting runs separately before any commit.

## Release process

Releases are cut from tags only. A tag push starts the pipeline; pushing to the
default branch does not. Never draft a release unless it was asked for in the
current conversation.

## Push approval

Never push to a remote without being asked in the current conversation. Local
commits are fine at any time. Approval for one push does not carry to the next.

## Database migrations

Migrations are numbered and the count constant must be bumped in the same
change, otherwise the new file is silently skipped at startup.

## Voice notes

Reply with text first so the conversation stays searchable, then attach the
generated audio. Both belong in the thread.

## Group chat language

Answer in the language the person you are addressing wrote in. The language
most common in the room does not override the individual you are replying to.

## Screenshot handling

When an image arrives, look at it before running any other tool. Evidence in
hand outranks a theory about what the problem probably is.

## Timezone handling

Timestamps are stored in UTC and rendered in the viewer's local zone. Never
store a local timestamp; the offset is lost and cannot be recovered later.

## Retry and backoff

Transient failures retry with exponential backoff and a jitter term. A hard
authentication failure is not transient and must not be retried.

## Cache invalidation

Cached parses carry the source modification time and length. Comparing only the
timestamp misses a rewrite that lands inside the same second.

## Test placement

Every test lives in its own file under the tests directory and is registered in
the module list. Inline test modules inside source files are not used here.

## Error handling

Never discard a failed result silently. Even when the code proceeds anyway, the
failure gets logged with enough context to identify what was lost.