# Where Are Procedural House Rules and Workflow Preferences Configured in Career-Ops?

> Discover where Career-Ops configures procedural house rules and workflow preferences. Find this crucial setting in modes/_custom.md for seamless customization.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: how-to-guide
- Published: 2026-08-28

---

**Career-Ops stores all procedural house rules and workflow preferences in [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md), a git-ignored user-layer file that loads after [`_profile.md`](https://github.com/santifer/career-ops/blob/main/_profile.md) and before mode-specific configurations.**

In the `santifer/career-ops` repository, personalized automation logic is separated from system-wide defaults. All persistent **procedural house rules**—including formatting mandates, section ordering constraints, and custom workflow automations—are centralized in a specific user-controlled file that survives system updates without being overwritten.

## The [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) Configuration File

The primary location for **procedural house rules** is [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md). This file belongs to the *User Layer* and is explicitly **git-ignored**, ensuring your customizations persist across repository pulls and updates. When this file is absent, the system automatically seeds it from [`modes/_custom.template.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.template.md) according to the Data Contract defined in [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md).

Key files governing this configuration include:

- [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) – The active user-layer file storing persistent workflow preferences.
- [`modes/_custom.template.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.template.md) – Template used to initialize [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md) when missing.
- [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) – Documents the loading hierarchy and system defaults.
- [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md) – Official specification listing [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md) as the canonical location for house rules.
- [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md) – High-level architectural overview of user customization layers.

## Configuration Hierarchy and Load Order

Understanding the load sequence is critical because later files override earlier ones. The system processes markdown mode files in this strict hierarchy:

```

modes/_shared.md   →   modes/_profile.md   →   modes/_custom.md   →   modes/<mode>.md

```

As implemented in `santifer/career-ops`, [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md) is always loaded **after** [`_profile.md`](https://github.com/santifer/career-ops/blob/main/_profile.md) and **before** the mode-specific markdown (e.g., [`modes/pdf.md`](https://github.com/santifer/career-ops/blob/main/modes/pdf.md), [`modes/oferta.md`](https://github.com/santifer/career-ops/blob/main/modes/oferta.md)). This positioning allows your house rules to override default behaviors while remaining available for mode-specific refinements. The loading order is documented in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md) and reinforced throughout the codebase, including in [`batch/batch-prompt.md`](https://github.com/santifer/career-ops/blob/main/batch/batch-prompt.md).

## Practical Examples for Managing Workflow Preferences

### Reading the Configuration Stack

Mode scripts assemble the final prompt by concatenating files in the hierarchy order. The following pseudo-code illustrates how **procedural house rules** are injected into the pipeline:

```javascript
// Assembly logic used by mode scripts
const shared   = await readFile('modes/_shared.md');
const profile  = await readFile('modes/_profile.md');
const custom   = await readFile('modes/_custom.md');   // ← procedural rules
const modeSpec = await readFile(`modes/${modeName}.md`);

const prompt = [
  shared,
  profile,
  custom,       // house rules applied here
  modeSpec
].join('\n\n');

```

### Defining Custom Rules

To enforce a workflow preference, edit [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) using markdown headers and list items. For example, to mandate a References section in PDF outputs:

```markdown

# modes/_custom.md

## PDF Generation Rules

- always-include: References
- date-format: YYYY-MM-DD

```

### Initializing from Template

If [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) does not exist, create it from the template:

```bash
cp modes/_custom.template.md modes/_custom.md

```

## Summary

- **Procedural house rules** live in [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md), which is git-ignored to prevent update overwrites.
- The configuration follows a strict hierarchy: [`_shared.md`](https://github.com/santifer/career-ops/blob/main/_shared.md) → [`_profile.md`](https://github.com/santifer/career-ops/blob/main/_profile.md) → [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md) → `<mode>.md`.
- The [`modes/_custom.template.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.template.md) file provides the initial structure when creating new customizations.
- Rules defined in [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md) apply across all modes, as documented in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md), [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md), and [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md).

## Frequently Asked Questions

### What happens if I delete [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md)?

If you delete [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md), the system will regenerate it from [`modes/_custom.template.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.template.md) during the next run. Your previous custom rules will be lost unless backed up, since the file is git-ignored and not tracked in version control.

### Can I override system-wide defaults using [`_custom.md`](https://github.com/santifer/career-ops/blob/main/_custom.md)?

Yes. Because [`modes/_custom.md`](https://github.com/santifer/career-ops/blob/main/modes/_custom.md) loads **after** [`modes/_profile.md`](https://github.com/santifer/career-ops/blob/main/modes/_profile.md) and **before** mode-specific files, any rules you define there will override default profile settings while remaining available for mode-specific refinements. This is the intended mechanism for user-level customization according to the Career-Ops data contract.

### Where is the loading order documented?

The official loading hierarchy is documented in [`modes/_shared.md`](https://github.com/santifer/career-ops/blob/main/modes/_shared.md), which explicitly defines the sequence. Additional confirmation appears in [`DATA_CONTRACT.md`](https://github.com/santifer/career-ops/blob/main/DATA_CONTRACT.md) and the architectural overview found in [`AGENTS.md`](https://github.com/santifer/career-ops/blob/main/AGENTS.md), ensuring consistent implementation across all mode scripts.