ARC Brain — decisions log
Choices where the master spec said "choose", plus deviations from the letter of the spec to fit ARC.
| Date | Decision | Choice | Why |
|---|---|---|---|
| 2026-07-29 | Primary store | New Prisma models (Note, Folder, Link, …), not ClaudeContext | Spec N1–N4; ClaudeContext is append-only keyed memory |
| 2026-07-29 | ClaudeContext | Keep permanently as LLM memory | User: still useful as pure LLM memory; no absorb/delete migration. Spec §18.3 out of scope |
| 2026-07-29 | HTTP base | /api/v1/brain via registerVersionedRoute | Match existing ARC API versioning (/api/brain legacy alias also registered) |
| 2026-07-29 | Module layout | server/src/modules/brain/* + thin routes/brain*.routes.ts + mcp/brain.tools.ts | Spec module boundary without rewriting all of ARC |
| 2026-07-29 | Table naming | @@map("snake_case") | Existing ARC Prisma convention |
| 2026-07-29 | Soft delete | Brain models only | Do not retrofit rest of ARC |
| 2026-07-29 | Vault root | server/data/vault in dev; /data/vault in Docker; override via BrainSettings.vaultPath / env | Spec default + local-friendly path |
| 2026-07-30 | MCP brain tools (core set) | brain_capture, brain_write, brain_read, brain_search, brain_append, brain_resolve, brain_backlinks, brain_daily, folder list/create/move | Enough for agent-first capture; remaining §16 tools in later phase |
| 2026-07-30 | Core brain_* always on | requiresPermissionToggle: false for capture/read/search/append/resolve/backlinks/daily/folder_list | Make Brain the default knowledge path without Tool Permissions toggles |
| 2026-07-30 | Settings LLM prompts | Recommended + new Brain block + narrowed Context scratch | Steer Claude to Brain for knowledge; context_* for agent prefs only |
| 2026-07-30 | In-app coach prompt | SystemPromptBuilder prefers brain_* for knowledge | Same policy as MCP copy-paste prompts |
| 2026-07-30 | Vault sync deps | chokidar + p-queue (p-queue reserved for queue polish) | Spec Phase 3; disable via ARC_BRAIN_FILE_SYNC=0 |
| 2026-07-30 | Note composition | Host notes compose via ![[…]] embeds + arc-* fences; brain_include / brain_split | Notion/Obsidian multi-content: databases/graphs are notes (or views) that can be included or split out |
| 2026-07-30 | Vault rename safety | Deferred unlink (2s) + folder hash rename-pair + reattach by frontmatter id | Obsidian folder/file rename must not destroy note ids |
| 2026-07-30 | Editor delivery | CM6 + / slash commands + [[ autocomplete + rich preview | Preview renders embeds, mermaid, YouTube/iframe/gif, callouts |
| 2026-07-30 | Excalidraw | Excalidraw editor UI on canvas page (autosave + JSON escape hatch) | Scene JSON on Canvas.data |
| 2026-07-30 | Public note pages | Per-note isPublished + publicSlug; /brain/p/:slug renders page only | Linked notes / private embeds sealed on public view |
| 2026-07-30 | Entity linking UX | API about links + MCP brain_entity_types/brain_notes_about/brain_publish + UI search/slash for all types | Make Person→People (and every type) easy from API/MCP/UI |
| 2026-07-29 | Timezone | Europe/Amsterdam at edges; UTC in DB | Spec + existing ARC patterns |
| 2026-07-30 | Task due dates | Task.dueDate / priority / completedAt shipped | Was deferred; now on model + API/MCP |
| 2026-07-30 | Vault git | gitEnabled + remote + auto-commit after vault writes | Optional; off by default |
| 2026-07-30 | Embeddings | Local hash embeddings + hybrid RRF; docker image pgvector/pgvector:pg15 | External embedding APIs optional later |
| 2026-07-30 | Live editor | Split Live mode (CM6 + rich preview side-by-side) | Full TipTap WYSIWYG not required for vault value |
| 2026-07-30 | Interactive views | ArcViewWidget runs /brain/views/run with filter + row links | Replaces static fence dump in preview |
| 2026-07-29 | Vector / pgvector | Float[] embeddings + optional pgvector image | App-level cosine when extension absent |
| 2026-07-29 | SocialInteraction name | Map to existing Interaction model | ARC schema name differs from spec |
| 2026-07-29 | Indexer transport | In-process async queue with backoff (not pg-boss yet) | Non-blocking; failed index must never fail domain writes. May move to pg-boss later — log if changed |
| 2026-07-29 | Day ownership | Index via Day.week.userId | Day has no direct userId |