AGENTS.md · git:20260604.408c0d4 · 2026-06-04 · sha256 43f666e188440fb0
AGENTS.md git:20260604.408c0d4A
Immutable. This exact content is served forever at /api/v1/blob/43f666e188440fb0.
# AGENTS.md — houseCARL Guidance for AI coding agents (Codex, and others that read `AGENTS.md`) working in this repository. houseCARL's deep operating manual is **[`CLAUDE.md`](CLAUDE.md)** — read it first; this file is the agent-agnostic companion, focused on a review checklist for pull requests. For what houseCARL *is* and how to build it, see **[`README.md`](README.md)**. > **Public-repo note.** `CLAUDE.md` references a private `dev/` working corpus (PRFAQ, plans, > session handoffs) that is **gitignored — not part of this repository**, so links into `dev/` > will not resolve in a clone. The code, standards, and skills are all here; the working notes > are not. ## The cornerstone — read before touching coverage houseCARL's load-bearing claim is **comprehensive, data-layer access** to the Skyrim load order. For records that means: **every record type Mutagen models is readable and writable — by construction, not by hand.** A build-time generator walks Mutagen's record interfaces and emits the schema + write-validation automatically, so houseCARL's coverage *is* Mutagen's coverage. Both prior builds hand-wired a schema and a write-translation per record type and never finished; this rebuild exists to end that. So: - **Never** hand-map a record type or reintroduce per-record-type write translations. - **Never** ship "just the common record types" — full coverage is not a scope choice. - A record type that's **absent** is a real upstream gap (Mutagen's delta vs xEdit) to **surface loudly**, never to guess around or silently skip. If a change pressures any of the above, stop and raise it via the PRFAQ revalidation protocol (`CLAUDE.md §4`) — don't work around it. ## Build & run - **Full plugin build:** `./scripts/build-plugin.ps1` — regenerates the reflection rulebook, publishes the server (framework-dependent, **trimming off** — trimming would strip reflected types and silently lose coverage), bundles skills, packs the release zip. Needs the **.NET 9 SDK**, Windows, PowerShell. - **Iterating on the generator/engine:** `dotnet build` then `dotnet run`. A `dotnet build && dotnet run` can serve a **stale** binary — run `dotnet clean` first when verifying a generator change, or the regenerated corpus won't reflect your edit. - Runtime config is read from a user-config file beside the exe (not the blanked `appsettings.json`); the MO2 instance is set at runtime, never hard-coded. ## Conventions - **MCP tools are `housecarl_<snake_case>`** — the prefix is locked (brand continuity); all names follow `standards/HOUSECARL_NAMING.md`. - The brand string **"houseCARL"** lives in exactly one place in code (the server's config). - **Atomic, focused commits** — one logical change per commit. - **Writes never mutate originals** — every patch is a **new** MO2 mod folder; sources are read-only. ## Review guidelines (for pull requests) Reviewing a change to houseCARL — human's or agent's — check, in priority order: 1. **Cornerstone intact** — no hand-wired coverage, no per-record-type write map, no "subset for now." Coverage stays reflection-driven and complete by construction. 2. **No silent failure (Q3)** — no silently wrong answer, no silently degraded mode. A tool that can't do the thing says so plainly. A swallowed error or quiet fallback is a defect. 3. **No silent workarounds** — a stumbling block should have been *surfaced* (`CLAUDE.md §4`), not patched around in a way that trades away something that was supposed to hold. 4. **Writes stay non-destructive** — changes go to a new plugin; originals untouched; masters are derived from the FormIDs actually referenced (plus the Skyrim.esm + Update.esm baseline every plugin carries, as the Creation Kit does), never hand-specified. 5. **Atomic & focused** — one logical change; the diff does what the message says, nothing extra. 6. **Correctness over performance** — where they conflict, correctness wins; perf concerns are raised factually, not as blockers. Be concrete and candid: name the file and line, say what's wrong and why, and prefer surfacing a real doubt over a tidy approval.