# How the AI Job Search Framework Uses Thin-Pointer Architecture to Prevent Configuration Drift

> Discover how the AI Job Search Framework prevents configuration drift with its thin-pointer architecture. Ensure all agent runtimes load a single, synchronized markdown configuration at execution for seamless tool management.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: architecture
- Published: 2026-09-01

---

**The AI Job Search Framework eliminates configuration drift by storing one canonical set of markdown configuration files that every agent runtime loads directly at execution time, ensuring all tools stay synchronized without duplicated settings.**

The MadsLorentzen/ai-job-search repository implements a **thin-pointer architecture** that treats the filesystem as a single source of truth for agent behavior. Instead of embedding configuration directly into Claude Code, Google Antigravity, Codex, Cursor, or Gemini CLI, the framework stores all workflow definitions, candidate profiles, and portal skills as markdown files that each runtime discovers and loads dynamically.

## What Is Thin-Pointer Architecture?

In traditional multi-agent systems, each runtime maintains its own copy of prompts, rules, and candidate data. The thin-pointer design inverts this model. As documented in [[`AGENTS.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/AGENTS.md)](AGENTS.md), the framework stores **one canonical set of files** and exposes lightweight pointers that direct every agent to the same source. When you update your candidate profile or modify a workflow step, the change propagates instantly to all connected runtimes because they reference the identical file path at execution time.

## Core Components of the Single-Source Design

### Centralized Candidate Profile

All personal details, education, skills, and target preferences reside in [[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)](CLAUDE.md) and the series of markdown files under [`.claude/skills/job-application-assistant/`](.claude/skills/job-application-assistant/). For example, [[`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md)](.claude/skills/job-application-assistant/01-candidate-profile.md) contains the authoritative candidate data. These files are never copied into agent-specific directories; instead, every runtime reads directly from these paths.

### Canonical Workflow Specifications

Step-by-step instructions for commands like `/setup`, `/scrape`, `/rank`, and `/apply` are defined once in the [`.claude/`](.claude/) directory. The job-application assistant skill in [[`.claude/skills/job-application-assistant/SKILL.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/skills/job-application-assistant/SKILL.md)](.claude/skills/job-application-assistant/SKILL.md) provides the full workflow specification, while individual command implementations—such as [[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)](.claude/commands/apply.md)—define the canonical logic for specific operations. Agent runtimes import these specs at runtime, guaranteeing consistent behavior across tools.

### Portable Portal-Search Skills

Individual job-portal CLIs are stored under [`.agents/skills/`](.agents/skills/) as lightweight skill descriptors. For instance, [[`.agents/skills/jobdanmark-search/SKILL.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.agents/skills/jobdanmark-search/SKILL.md)](.agents/skills/jobdanmark-search/SKILL.md) defines the interface for searching JobDanmark. The scraper workflow in [`.claude/skills/job-scraper/`](.claude/skills/job-scraper/) discovers and invokes these skills automatically. This eliminates the need to maintain separate portal implementations for each agent runtime.

## How Runtime Loading Eliminates Drift

The thin-pointer architecture prevents configuration drift through four key mechanisms:

- **Single Source of Truth** – All configuration lives in one place. There are no parallel config files that could diverge across Claude Code, Cursor, or other environments.

- **Runtime Resolution** – Agents load specifications at execution time rather than build time. When you modify [[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)](.claude/commands/apply.md), the next invocation of `/apply` immediately uses the updated logic without requiring redeployment.

- **Explicit File References** – Every command documentation references the exact file it consumes. The `/apply` command explicitly states that it follows the header and match-then-update rules defined in [[`.claude/commands/apply.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/.claude/commands/apply.md)](.claude/commands/apply.md), making dependencies auditable.

- **Modular Skill Isolation** – Portal-specific logic is isolated in [`.agents/skills/`](.agents/skills/) and referenced by path. Updating a single skill file updates the entire pipeline automatically because all agents resolve the same filepath.

## Practical Implementation Examples

You can interact with the thin-pointer architecture programmatically or via CLI:

```python

# Load the canonical candidate profile directly from the source file

import pathlib

profile_path = pathlib.Path("CLAUDE.md")
profile = profile_path.read_text()
print(f"Loaded candidate profile: {len(profile)} characters from single source")

```

```bash

# Execute the apply command – it automatically reads the canonical spec

ai-job-search-cli /apply \
  --cv cv/main_acme_corp_software_engineer.tex \
  --cover cover_letters/cover_acme_corp_software_engineer.tex \
  --source https://jobs.example.com/12345 \
  --deadline "2024-12-31"

# The CLI pulls the exact workflow from .claude/commands/apply.md

```

```javascript
// Discover and execute a portal-search skill by its thin pointer
import { runSkill } from "@ai-job-search/agents";

runSkill("jobdanmark-search", { query: "Python developer" });
// Internally loads SKILL.md from .agents/skills/jobdanmark-search/

```

## Summary

- The **thin-pointer architecture** stores all configuration in canonical markdown files rather than duplicating settings across agent runtimes.
- **Candidate profiles** live exclusively in [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) and `.claude/skills/job-application-assistant/`, preventing stale copies.
- **Workflow specifications** in `.claude/commands/` and `.claude/skills/` provide authoritative instructions that all agents load at runtime.
- **Portal skills** under `.agents/skills/` are discovered dynamically, ensuring updates propagate instantly to the scraper workflow.
- **Runtime loading** guarantees that any change to the source files immediately affects all connected agents, eliminating configuration drift.

## Frequently Asked Questions

### What is configuration drift in AI agent frameworks?

Configuration drift occurs when multiple instances of an agent or different agent runtimes maintain separate copies of prompts, rules, or data that gradually become inconsistent. In the AI Job Search Framework, drift is prevented because every runtime reads from the same file paths, ensuring all agents operate with identical configuration at all times.

### How does thin-pointer architecture differ from traditional configuration management?

Traditional approaches often embed configuration directly into the agent environment or require build-time compilation of prompts. The thin-pointer architecture keeps configuration external as markdown files that agents resolve at execution time. This eliminates the need to rebuild or redistribute agents when workflows change.

### Can I use the AI Job Search Framework with multiple agent runtimes simultaneously?

Yes. The framework is designed specifically for interoperability across Claude Code, Google Antigravity, Codex, Cursor, Gemini CLI, and other environments. Because all runtimes load the same files from `.claude/` and `.agents/skills/`, you can switch between agents or use them in parallel without configuration inconsistencies.

### What happens if I need to update my candidate profile?

Simply edit [[`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md)](CLAUDE.md) or the relevant file in [`.claude/skills/job-application-assistant/`](.claude/skills/job-application-assistant/). The next time any agent runtime accesses your profile, it will automatically load the updated version. There is no need to sync changes across multiple agent configurations or restart services.