Ctrl K
ComunidadGuías…

CONTRIBUTING.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Contributing to Context-M

Thanks for taking the time to contribute. This document is the contract
between you and the maintainers. It is short on purpose.

> **TL;DR** — open an issue first, get it labeled `accepted`, then open
> a PR that says `Closes #<n>`. PRs without an accepted issue are
> auto-closed by the [PR Gate](#pr-gate) workflow. **Closed does not
> mean rejected.**

## Code of conduct

Be specific, be honest, be kind. The repo records what was tried and
what failed in `worklog.md`; disagreements are welcome, ad-hominem
attacks are not.

## Issues

- Search existing issues before opening a new one.
- A good issue names the version, includes a runnable reproduction, and
  shows the real output or traceback you saw. Bugs without a repro will
  be closed with the `needs-repro` label.
- Feature requests are welcome; the maintainers add the `accepted`
  label when we agree to take them on. **Only issues labeled `accepted`
  are eligible for linked PR review** — see the PR Gate section below.

## Pull requests

- Branch from `main`; rebase before opening if `main` has moved.
- Title format: `<area>: <imperative summary>` (e.g.
  `reader: add employment-anchored temporal window`).
- Description must include `Closes #<n>` linking the accepted issue.
- Squash-merge only; one commit per PR.
- The full test suite must be green before push:
  `pytest -x` from the repo root.
- Update `worklog.md` (template below) with what you changed, why, and
  any honest benchmark numbers if you touched the retrieval path.

## PR Gate

This repo runs [.github/workflows/pr-gate.yml](.github/workflows/pr-gate.yml)
(Mem0-style gate). When you open a PR:

1. The gate checks whether any linked issue carries the `accepted`
   label.
2. If yes: the PR stays open, ready for review.
3. If no: the gate posts a comment with the `<!-- pr-gate -->` marker
   and closes the PR. **Closing is a queue operation, not a rejection.**
4. When a maintainer labels the linked issue `accepted`, the gate
   reopens the PR automatically. You do nothing.

Exemptions:

- Documentation-only PRs (anything under `docs/` plus `README.md`,
  `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`,
  `SECURITY.md`) skip the gate entirely.
- Bots, same-repo branch pushes, and OWNER/MEMBER/COLLABORATOR
  authors skip the gate.
- PRs opened before `2026-08-28T00:00:00Z` are grandfathered.

## Instructions for autonomous coding agents

> The cross-tool canonical instructions live in
> [AGENTS.md](AGENTS.md). `CLAUDE.md` is a one-line alias.
> This section is the human-facing summary; agents should read
> `AGENTS.md` directly.

If you are an autonomous coding agent (Claude Code, Codex, Cursor,
Aider, Jules, Gemini CLI, etc.) operating on this repository, follow
these rules. They exist because poorly-written agent instructions
**reduce** agent success rates by ~20% (Feb 2026 arXiv study) — these
rules are the escape hatch.

### 1. Read before you write

- Read `worklog.md` (last 200 lines at minimum) before any non-trivial
  change. The worklog records what was tried and what failed. You will
  reproduce a previous failure if you skip this.
- Read `docs/FAILURE_MODES.md` before touching the extractor — it
  records which phrasings break the μ=0 path.
- Read `docs/METHODOLOGY.md` before claiming any benchmark number.

### 2. Determinism is a hard contract

- The μ=0 protocol requires zero LLM calls at ingest and retrieval. Any
  change that introduces an LLM call into the ingest or retrieval path
  is a critical regression, not an optimization.
- Never tiebreak on uuid4 — fact ids are random per process. Use the
  content-key (`(subject, relation, value, valid_from)`). See
  `cortexm/bridge/reader.py::_content_key`.
- Never rely on dict insertion order across processes. Python dicts are
  insertion-ordered but the order is process-dependent when populated
  from set iteration or random queries.
- Any RNG must be seeded. `random.seed(...)` at the top of the test or
  script, or use `numpy.random.default_rng(seed)`.

### 3. Provenance on every retrieval

- The `RetrievalResult.provenance` field is non-optional. If you add a
  retrieval path, you must populate provenance — query → VSA match →
  symbolic dereference → source hash → source text.
- Don't strip the source span when refactoring the writer. The span is
  what the reader dereferences back to the original text.

### 4. Benchmark honesty

- Run the full Tier-1 / Tier-4 suite before claiming a recall number in
  a PR description or commit message.
- Use the deterministic judge (`--judge det`) for local runs; reserve
  the Gemini judge for CI — it costs tokens and is rate-limited.
- Two independent graders are required before claiming a fix. The
  deterministic judge grades slightly higher than the LLM judge; both
  must move in the same direction for the claim to stand.
- Never round up. `0.052 recall` is `5.2%`, not `~6%` and not `10%`.
- Document the run ID (e.g. GHA run 33181804451) and SHA in any
  benchmark block you add to `docs/BENCHMARKS.md`.

### 5. PR scope

- One concern per PR. A PR that touches both the reader and the writer
  will be closed with `please-split`.
- Don't refactor unrelated code in a PR that claims a recall fix. The
  diff must be readable end-to-end by a human in under five minutes.
- Don't add dependencies. The core package has one runtime dependency
  (`numpy>=1.24`); optional deps are gated behind `[project.optional-
  dependencies]`. Adding a new one is a governance decision, not an
  implementation detail.

### 6. Worklog protocol

Append (do not overwrite) a new section to `worklog.md` using this
template:

```markdown
---
Task ID: <short, e.g. 20-list-superseded>
Agent: <agent name>
Task: <one-line summary of what was asked>

Work Log:
- <concrete step 1>
- <concrete step 2>
- ...

Stage Summary:
- <key results / important decisions / produced artifacts>
```

The worklog is append-only. If you made a mistake, document it in the
next section — do not edit the previous one.

### 7. When in doubt, don't

If you are about to make a change and you cannot find prior art in
`worklog.md` or `docs/`, stop. Open an issue, describe the change, and
wait for the `accepted` label. The repo rewards patience.

## Worklog template for human contributors

Same template as above (§6). Paste it at the bottom of `worklog.md`
when your PR is ready for review. The reviewer will read the worklog
entry before reading the diff.

## License

By contributing, you agree that your contributions are licensed under
the [Apache-2.0](LICENSE) license that covers this repository.