AGENTS.md
Rama main · réplica de lectura del repositorio original.
# AGENTS.md
> Canonical instructions for autonomous coding agents (Codex, Cursor,
> Aider, Claude Code, Jules, Gemini CLI, etc.). `CLAUDE.md` at the repo
> root is a one-line alias to this file — Claude Code's discovery
> convention. The cross-tool spec is <https://agents.md>.
## Project overview
`cortexm` is a deterministic neuro-symbolic memory layer for AI agents.
- 96 bytes per fact on disk; zero LLM call at ingest (μ=0 protocol).
- Provenance on every fact (source span, confidence, `trigger_source`,
`valid_from` / `valid_to`, BLAKE3 hash chain).
- Surface: `Reader`, `Writer`, `Extractor`, `Bridge`, `TraceStore`,
`MemoryPalace`, `MCP server`, `REST server`, `SPARQL endpoint`.
- Mem0-compatible public surface: `from cortexm import Memory`.
The Python module is `cortexm/` (rename from `context_m/` landed in this
cycle). A thin `context_m.py` shim is shipped for backward compat with
existing scripts that did `from context_m import Memory`.
## Build and test commands
```bash
pip install -e ".[dev]" # editable install + dev deps
pytest -x # full suite, fail-fast
pytest tests/test_research_steals.py -k list # one file / pattern
ruff check . && ruff format --check . # lint
python -m cortexm.cli --help # sanity-check the CLI
python -m cortexm.cli doctor # SIMD kernels, SQLite ver, deps
```
Tier-1 / Tier-4 benchmark runs (slow, opt-in):
```bash
python benchmarks/run_ood_pipeline.py --personas 4 --skip-render --no-enrich --no-judge
python scripts/longmemeval_judge.py
python scripts/run_beam10m_benchmark.py --config all
```
## Code style
- Lowercase module names; one module per file; no `__init__.py` re-exports
except the top-level public API in `cortexm/__init__.py`.
- Type hints required on every public function. `from __future__ import
annotations` at the top of every module.
- Prefer `pathlib.Path` over `os.path`.
- Prefer `dataclass(slots=True)` for value objects.
- Never use `print()` in library code — use `logging` (stdlib) or the
`cortexm.metrics` counters.
- Never catch `Exception` broadly — name the exception type.
- Determinism is a hard contract: any change that introduces nondeterminism
(uuid4 tiebreaks, dict-order dependence, RNG without seed) breaks the
BEAM-honest protocol and must be reverted.
- Every retrieval MUST carry provenance. The `RetrievalResult.provenance`
field is non-optional.
## Testing instructions
- Tests live in `tests/` mirroring the `cortexm/` package structure.
- A test must assert behaviour, not implementation. Don't pin on internal
attribute names that are an implementation detail.
- Run the full Tier-1 / Tier-4 benchmark suite before claiming any
recall number in a PR description or commit message.
- Use the deterministic judge (`--judge det`) for local runs; reserve
the Gemini judge (`--judge gemini`) for CI — it costs tokens and is
rate-limited.
- The full suite must be green before push. The worklog at `worklog.md`
records the last green count.
## Security considerations
- Never `pickle.loads` untrusted bytes. The store uses SQLite + JSON
columns precisely to avoid pickle.
- The SQLite store is read-only-by-default; writes require explicit
`mode="rw"` on `TraceStore(...)`.
- The MCP server (`cortexm serve`) exposes Reader and Writer tools
alike over stdio — there is no `--allow-writes` gate (and no
`serve-mcp` subcommand); restrict writes at the client (e.g.
opencode `permission`) when the deployment needs it.
- PII redaction is OFF by default (`Config.pii_mode="off"`); enable
with `CORTEXM_PII_MODE` (or legacy `CONTEXT_M_PII_MODE`) set to `redact`
(`block`/`tag` also available) for personal or untrusted corpora.
When enabled, agents MUST NOT disable it without a recorded
justification in the fact's `provenance.pii` field.
- Prompt-injection defense: facts ingested from untrusted text are
tagged `untrusted=True`; the reader demotes them in ranking and the
context block formatter escapes their values. Do not bypass.
- ZK-SQL proofs (PLONKish / Halo2-style) are opt-in via
`cortexm.features.zk`; treat them as experimental until the
verifying-key fixture suite is complete.
## PR instructions
- Title format: `<area>: <imperative summary>` — e.g.
`reader: add employment-anchored temporal window`.
- Always link the PR to an issue with `Closes #<n>`.
- The linked issue MUST carry the `accepted` label. PRs without one
are auto-closed by `.github/workflows/pr-gate.yml` (Mem0-style gate).
"Closed does not mean rejected" — see CONTRIBUTING.md.
- Squash-merge only; one commit per PR.
- Update `worklog.md` with a new section appended at the bottom
(template in CONTRIBUTING.md). The worklog is the canonical history.
## Dev environment tips
- Run `python -m cortexm.cli doctor` after first install to verify SIMD
kernels, SQLite version, and optional deps (BLAKE3, cryptography).
- The worklog at `worklog.md` is the canonical history of what's been
tried — read it before designing a non-trivial change.
- `docs/ARCHITECTURE.md`, `docs/METHODOLOGY.md`, `docs/BENCHMARKS.md`
are the three docs that answer most "why" questions.
- `docs/FAILURE_MODES.md` records which phrasings break the μ=0
extractor — read it before claiming a fix to a Tier-1 weak spot.
- The Rust core at `rust/cortexm-core/` mirrors the hot paths
(`hash`, `simd`, `slb`, `conv`). The Python path is canonical;
the Rust path is acceleration only. Parity tests live in
`tests/test_rust_accel.py` and are skipped if the wheel isn't built.