# Reasonix project memory This file is loaded into every session's system prompt (the cache-stable prefix), so keep it concise and durable — it is the project's standing instructions to the agent. It is the Reasonix analog of Claude Code's CLAUDE.md. ## Conventions - Go kernel under `internal/`; each package owns one concern and documents it in a package comment. Match the surrounding comment density and idiom when editing. - One transport-agnostic `control.Controller` sits behind every frontend (chat TUI, HTTP/SSE serve, Wails desktop). Add behavior to the controller, not a frontend, so all three inherit it. - Cache-first: the system-prompt prefix (base prompt + tools + memory) must stay byte-stable across turns so DeepSeek's automatic prefix cache stays warm. Never mutate it mid-session — ride the turn tail instead (see `control.Compose`). ## Memory - Hierarchical docs: `REASONIX.md` (this file, committed/shared), `REASONIX.local.md` (personal, git-ignored), user-global `~/.config/reasonix/REASONIX.md`, and any `REASONIX.md` in an ancestor dir. `AGENTS.md` is accepted as a fallback name. - `@path` on its own line imports another file's contents. - `#` in chat quick-adds a line here. The `remember` tool saves durable facts to the per-project auto-memory store (frontmatter files + `MEMORY.md` index), which loads into the prefix on the next session. ## Notes ## Pre-push CI simulation Run these **before every commit** to catch the fastest CI failures locally: ```bash gofmt -w . # catches gofmt (saves ~13s CI) go vet ./... # catches vet warnings (saves ~52s CI/lint) go test ./internal/tool/builtin/ ./internal/boot/ # catches tool/boot test breaks ``` CI runs `golangci-lint` (not locally available), but gofmt + vet already block ~80% of fast-fail scenarios. ## Import cycle rule Before importing a new internal package from a non-test file, verify the target package's **test files** aren't already importing back to you: ``` # BAD: agent(_test.go) → tool/builtin(sessions.go) → agent → setup failed ``` Use `go test ./path/to/target/` to detect cycles **before** pushing. A `[setup failed]` message means a cycle exists. ## PR hygiene - **One force-push per round of review feedback.** Multiple force-pushes destroy review history and confuse reviewers. - **Keep the PR diff minimal.** Only the files relevant to the PR's purpose — no stray changes from other branches. - **Amend, don't add commits, for review feedback** — keeps the commit history clean. ## Cache-impact PR metadata When PR changes touch files under `internal/boot/`, `internal/tool/`, `internal/provider/`, or other cache-sensitive paths (listed in `scripts/check-cache-impact.sh`), the PR body MUST include these lines at the end: ``` Cache-impact: Cache-guard: ``` If the PR also touches files under `internal/config/`, `internal/memory/`, `internal/outputstyle/`, `internal/skill/`, or `internal/boot/`, add: ``` System-prompt-review: ``` Values `n/a`, `none`, `todo`, `tbd` are rejected — use a descriptive reason instead.