# What Is the `auto-memory scope` Boundary and How It Differs from In-Scope Content Files in santifer/career-ops

> Understand the `auto-memory scope` boundary and its difference from in-scope content files in santifer/career-ops. Learn about behavioral steering data vs. factual content.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: deep-dive
- Published: 2026-08-20

---

**The `auto-memory scope` is a persistent store for behavioral steering data (preferences, rules, operational state) that never contains factual claims, while `in-scope content files` are the authoritative sources for all user-facing output like CVs and cover letters.**

The **auto-memory scope boundary** is a fundamental architectural principle in santifer/career-ops that separates how an AI agent remembers *how to behave* from where it finds *what to say*. Understanding this distinction is critical for anyone customizing the system or debugging unexpected outputs.

## Why the Boundary Exists

Career-ops serves two distinct needs: **consistent personality** across sessions and **verifiable accuracy** in generated content. Without this separation, an agent might hallucinate achievements into a CV or apply outdated tone preferences to critical application materials.

The boundary enforces that:

- **Auto-memory** influences *style* and *process*
- **In-scope files** provide *substance* and *facts*

## Auto-Memory Scope: Behavioral Steering Only

The **auto-memory scope** stores persistent data used exclusively to steer agent behavior. According to the source code in [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) [lines 35-38](https://github.com/santifer/career-ops/blob/main/AGENTS.md#L35-L38), this includes:

- **Style and tone preferences** (cadence, formality level)
- **Process rules** (workflow preferences, automation triggers)
- **Operational state** (active relationships, learned outcomes from past interactions)
- **External references** (contacts, company-specific context)

Critically, **auto-memory never holds factual claims** about your work history, achievements, or authorship. It lives in:

- Local path: `~/.claude/projects/.../memory/`
- Web UI path: [`.career-ops-web/memory.md`](https://github.com/santifer/career-ops/blob/main/.career-ops-web/memory.md)

```js
// Fetching persisted auto-memory (read-only behavioral data)
import fetch from 'node-fetch';

const resp = await fetch('http://localhost:3000/api/memory');
const { memory } = await resp.json();

console.log('Current auto-memory →', memory.trim());

```

As implemented in `web/src/lib/run-prompts.mjs` [lines 54-55](https://github.com/santifer/career-ops/blob/main/web/src/lib/run-prompts.mjs#L54-L55), the prompt builder conditionally injects this memory with explicit labeling: "Durable notes about the user (from their profile)." This demarcation prevents confusion with authoritative content.

## In-Scope Content Files: The Single Source of Truth

**In-scope content files** are the exclusive sources for all user-facing prose generation. The system reads these files on every run and never falls back to auto-memory for factual content.

Per [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) [lines 27-30](https://github.com/santifer/career-ops/blob/main/AGENTS.md#L27-L30), these include:

| File | Purpose |
|------|---------|
| [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) | Canonical CV with all position descriptions, metrics, and outcomes |
| [`article-digest.md`](https://github.com/santifer/career-ops/blob/main/article-digest.md) | Published writing samples and thought leadership |
| [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) | Personal profile, targeting preferences, compensation data |
| [`modes/_profile.md`](https://github.com/santifer/career-ops/blob/main/modes/_profile.md) | Career archetypes, narrative framing, negotiation scripts |
| [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) | Procedural rules specific to your workflow |
| [`voice-dna.md`](https://github.com/santifer/career-ops/blob/main/voice-dna.md) | Writing style samples for voice matching |
| [`interview-prep/story-bank.md`](https://github.com/santifer/career-ops/blob/main/interview-prep/story-bank.md) | Behavioral interview stories with STAR format |
| `interview-prep/<company>.md` | Company-specific interview preparation |

```js
// Reading an in-scope content file (authoritative source)
import { readFileSync } from 'fs';

const cv = readFileSync('cv.md', 'utf8');
console.log('CV content length:', cv.length);

```

## How the Boundary Enforces Source-of-Truth

The separation operates through three mechanisms in the santifer/career-ops codebase:

### 1. Prompt Construction Excludes Auto-Memory for Facts

When a mode (e.g., `evaluate`, `pdf`, `cover`) builds its prompt, it explicitly injects in-scope file contents while **excluding auto-memory from factual grounding**. This guarantees every claim about your experience originates from a file you control and version.

### 2. Conditional Memory Injection with Clear Labeling

In `run-prompts.mjs`, the memory string is only added when non-empty, and even then carries explicit framing that distinguishes it from authoritative sources. The `/api/memory` endpoint returns raw memory content, but the prompt builder governs how (and whether) it influences generation.

### 3. Safety Guarantees Against Fabrication

Because auto-memory cannot hold CV or achievement data, the system prevents accidental hallucination. Any generation request lacking supporting content in the in-scope files triggers either rejection or a placeholder prompting you to add the missing information.

## Practical: Modifying Behavior vs. Modifying Content

The boundary creates two distinct customization paths:

| Goal | Action | Where It Writes | Effect |
|------|--------|---------------|--------|
| Change facts, achievements, or narrative | Edit [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md), [`modes/_profile.md`](https://github.com/santifer/career-ops/blob/main/modes/_profile.md), or [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml) | In-scope files | Immediate impact on all generated output |
| Adjust tone, add rules, or remember preferences | Use the **remember** command | Auto-memory | Persistent across sessions, never appears in output |

```js
// Adding a behavioral rule to auto-memory via CLI
await fetch('http://localhost:3000/api/assistant', {
  method: 'POST',
  body: JSON.stringify({
    kind: 'remember',
    input: 'Prefer remote-first roles; avoid onsite interviews',
  }),
});

```

```js
// Updating the tracker (in-scope operation, never touches auto-memory)
import { execSync } from 'child_process';

execSync('node set-status.mjs 123 Applied --note "Sent application"');

```

## Summary

- **Auto-memory scope** stores behavioral steering data—preferences, rules, and operational state—in `~/.claude/projects/.../memory/` or [`.career-ops-web/memory.md`](https://github.com/santifer/career-ops/blob/main/.career-ops-web/memory.md), and **never contains factual claims** about your work.
- **In-scope content files** like [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md), [`config/profile.yml`](https://github.com/santifer/career-ops/blob/main/config/profile.yml), and [`modes/_profile.md`](https://github.com/santifer/career-ops/blob/main/modes/_profile.md) are the **sole source of truth** for all generated CVs, cover letters, and application materials.
- The [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) specification in santifer/career-ops enforces this boundary through explicit prompt construction that excludes auto-memory from factual grounding.
- Use the **remember** command to modify behavior; edit in-scope files to modify content.

## Frequently Asked Questions

### What happens if I put CV content into auto-memory?

The system will ignore it for factual claims. Even if present, auto-memory is explicitly excluded from the source-of-truth pipeline that generates CVs and cover letters. You must place factual content in [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) or other in-scope files.

### Why does the web UI have a separate memory file at [`.career-ops-web/memory.md`](https://github.com/santifer/career-ops/blob/main/.career-ops-web/memory.md)?

This provides web-only persistence for users running career-ops without local file system access. It functions identically to the CLI auto-memory: behavioral steering only, no factual content, governed by the same boundary rules in [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md).

### How do I verify which files are currently in-scope for a generation request?

Check [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) [lines 27-30](https://github.com/santifer/career-ops/blob/main/AGENTS.md#L27-L30) for the authoritative list. The prompt builder in each mode explicitly loads these files; no others are consulted for factual content.

### Can I disable auto-memory entirely?

Yes—an empty or missing memory file simply results in no behavioral steering data being injected. The prompt builder in `web/src/lib/run-prompts.mjs` conditionally adds memory only when the string is non-empty, so absence has no functional impact beyond losing preference persistence.