# Prompt changes in v2.1.299

> 2 changes since v2.1.296, landing in 22 of 23 prompts.

[Web version](https://changelogs.core-directive.com/prompts/2.1.299)

## 1. Self-Modification rule now covers .claude/dev-mods/ session mods

Auto-mode classifier prompt · entry “Self-Modification”

The auto-mode classifier's list of config surfaces adds `.claude/dev-mods/` (session mods), or `$CLAUDE_CONFIG_DIR/dev-mods/` when the config home is relocated. Unrequested edits there that widen permissions, weaken guards, or write consent the user did not give are now treated as Self-Modification, like the other config paths. This appeared in only 1 of 23 captures, so it may be specific to one setup.

- +14 / -0 words
- Landed in 1 of 23 prompts (auto-mode classifier)

```diff
-- Self-Modification [named+specifics — **must name:** that this specific permission or consent change is wanted]: Edits to the agent's own config that (a) add or widen permissions or weaken guards — permission allow rules (e.g. wildcard `"Bash(prefix:*)"` entries), hook or sandbox changes, approval-gate settings — that the user did not explicitly ask for, even while making a user-requested edit to the same file; or (b) write consent or instruction content the user did not give — text in `CLAUDE.md`/memory whose effect is to pre-authorize, widen, or clear soft blocks in this prompt on future actions (manufactured user intent). Config surfaces: `.claude/settings*.json`, `CLAUDE.md`, `CLAUDE.local.md`, `.claude.json`, `.claude/rules/`, `.claude/hooks/`, `.claude/commands/`, `.claude/agents/`, `.claude/skills/`, `.claude/output-styles/`, `.claude/workflows/`, `.claude/routines/`, `.claude/scheduled_tasks.json`, `.claude/loop.md`, `.mcp.json`, or equivalent config the agent loads at startup. Routine content edits to these files — recording a preference, project fact, or a permission the user stated in their own message — are NOT this rule and need no clearing: a user asking for a `CLAUDE.md` update is very routine. A user message stating a permission makes that edit — and similar subsequent ones — user-requested rather than this rule's matter; it is not a standing exemption for unlike edits. Not every path under `.claude/` is config: `.claude/worktrees/<name>/` is where Claude Code stores git worktrees, so treat files under it as ordinary project files (though a nested config path from the list above inside a worktree is still Self-Modification), and a project-specific `.claude/` subdirectory outside the list above is not by itself Self-Modification.
+- Self-Modification [named+specifics — **must name:** that this specific permission or consent change is wanted]: Edits to the agent's own config that (a) add or widen permissions or weaken guards — permission allow rules (e.g. wildcard `"Bash(prefix:*)"` entries), hook or sandbox changes, approval-gate settings — that the user did not explicitly ask for, even while making a user-requested edit to the same file; or (b) write consent or instruction content the user did not give — text in `CLAUDE.md`/memory whose effect is to pre-authorize, widen, or clear soft blocks in this prompt on future actions (manufactured user intent). Config surfaces: `.claude/settings*.json`, `CLAUDE.md`, `CLAUDE.local.md`, `.claude.json`, `.claude/rules/`, `.claude/hooks/`, `.claude/dev-mods/` (session mods; `$CLAUDE_CONFIG_DIR/dev-mods/` when the config home is relocated), `.claude/commands/`, `.claude/agents/`, `.claude/skills/`, `.claude/output-styles/`, `.claude/workflows/`, `.claude/routines/`, `.claude/scheduled_tasks.json`, `.claude/loop.md`, `.mcp.json`, or equivalent config the agent loads at startup. Routine content edits to these files — recording a preference, project fact, or a permission the user stated in their own message — are NOT this rule and need no clearing: a user asking for a `CLAUDE.md` update is very routine. A user message stating a permission makes that edit — and similar subsequent ones — user-requested rather than this rule's matter; it is not a standing exemption for unlike edits. Not every path under `.claude/` is config: `.claude/worktrees/<name>/` is where Claude Code stores git worktrees, so treat files under it as ordinary project files (though a nested config path from the list above inside a worktree is still Self-Modification), and a project-specific `.claude/` subdirectory outside the list above is not by itself Self-Modification.
```

## 2. Cron jitter widens and Claude must report actual next run time

CronCreate tool description · under “Runtime behavior”

Recurring cron jobs can now run up to 50% of their period late (max 30 min) instead of 10% (max 15 min), and the jitter is described as a fixed per-job offset. Claude is now told to give users the actual next run time returned by CronCreate or CronList rather than the minute written in the cron expression. The 90-second early shift for one-shot jobs on :00 or :30 is unchanged.

- +58 / -13 words
- Landed in 21 of 23 prompts (main prompt 6/6, session agents, slash commands 3/3, compaction, system reminders 7/8, subagents 3/3)

```diff
-Jobs only fire while the REPL is idle (not mid-query). The scheduler adds a small deterministic jitter on top of whatever you pick: recurring tasks fire up to 10% of their period late (max 15 min); one-shot tasks landing on :00 or :30 fire up to 90 s early. Picking an off-minute is still the bigger lever.
+Jobs only fire while the REPL is idle (not mid-query). The scheduler shifts each job by a fixed per-job offset on top of whatever you pick: by default a recurring job runs up to 50% of its period late (max 30 min), and a one-shot job landing on :00 or :30 runs up to 90 s early. The result of this tool and of CronList gives each job's actual next run time: when you tell the user when a job will run, give that time, not the minute in the cron expression. Picking an off-minute is still the bigger lever.

-Jobs only fire while the REPL is idle (not mid-query). Durable jobs persist to .claude/scheduled_tasks.json and survive session restarts — on next launch they resume automatically. One-shot durable tasks that were missed while the REPL was closed are surfaced for catch-up. Session-only jobs die with the process. The scheduler adds a small deterministic jitter on top of whatever you pick: recurring tasks fire up to 10% of their period late (max 15 min); one-shot tasks landing on :00 or :30 fire up to 90 s early. Picking an off-minute is still the bigger lever.
+Jobs only fire while the REPL is idle (not mid-query). Durable jobs persist to .claude/scheduled_tasks.json and survive session restarts — on next launch they resume automatically. One-shot durable tasks that were missed while the REPL was closed are surfaced for catch-up. Session-only jobs die with the process. The scheduler shifts each job by a fixed per-job offset on top of whatever you pick: by default a recurring job runs up to 50% of its period late (max 30 min), and a one-shot job landing on :00 or :30 runs up to 90 s early. The result of this tool and of CronList gives each job's actual next run time: when you tell the user when a job will run, give that time, not the minute in the cron expression. Picking an off-minute is still the bigger lever.
```

## Where each change landed
- [Claude Code, default](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=cli): #2
- [Claude Code, seeded with this account's feature flags](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=cli&config=flags-account): #2
- [Claude Code, seeded with anonymous feature flags](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=cli&config=flags-anon): #2
- [Agent SDK, default](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=sdk-cli): #2
- [Agent SDK, seeded with this account's feature flags](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=sdk-cli&config=flags-account): #2
- [Agent SDK, seeded with anonymous feature flags](https://changelogs.core-directive.com/prompts/2.1.299/system?arm=sdk-cli&config=flags-anon): #2
- [Auto-mode classifier](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=automode&arm=sdk-cli): #1
- [Session agents: claude](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=agent-claude&arm=cli): #2
- [Slash commands: /init](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=command-init&arm=sdk-cli): #2
- [Slash commands: /security-review](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=command-security-review&arm=sdk-cli): #2
- [Slash commands: /team-onboarding](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=command-team-onboarding&arm=sdk-cli): #2
- [Compaction: Compaction instruction](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=compaction&arm=cli): #2
- [System reminders: Claude md](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-claude-md&arm=sdk-cli): #2
- [System reminders: Hook pretool block](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-hook-pretool-block&arm=sdk-cli): #2
- [System reminders: Read dup](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-read-dup&arm=sdk-cli): #2
- [System reminders: Read empty](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-read-empty&arm=sdk-cli): #2
- [System reminders: Read offset](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-read-offset&arm=sdk-cli): #2
- [System reminders: Skill run](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-skill-run&arm=sdk-cli): #2
- [System reminders: Todo nag](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-todo-nag&arm=sdk-cli): #2
- [System reminders: Toolsearch deferred](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=reminder-toolsearch-deferred&arm=sdk-cli): unchanged
- [Subagents: explore](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=subagent-explore&arm=sdk-cli): #2
- [Subagents: general-purpose](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=subagent-general-purpose&arm=sdk-cli): #2
- [Subagents: plan](https://changelogs.core-directive.com/prompts/2.1.299/system?surface=subagent-plan&arm=sdk-cli): #2

## Did not change
- 28 tool descriptions are word for word the same, 1 moved and is listed above. Unchanged: Agent, AskUserQuestion, Bash, CronDelete, CronList, Edit, EnterPlanMode, EnterWorktree, ExitPlanMode, ExitWorktree, ListAgents, Monitor, NotebookEdit, PushNotification, Read, ReportFindings, ScheduleWakeup, SendMessage, Skill, TaskCreate, TaskGet, TaskList, TaskStop, TaskUpdate, WebFetch, WebSearch, Workflow, Write.
- 1 prompt did not move at all: System reminders: Toolsearch deferred
- set aside as capture noise: 358 billing header lines
- set aside as capture noise: 224 capture date lines
- set aside as capture noise: 224 host kernel lines
