claude-dev-env 8.37.0 → 8.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,42 @@
1
+ Back to the [rule entry](../../rules/asd-ste100-language.md).
2
+
3
+ # ASD-STE100 language policy
4
+
5
+ Use this rule as the sole general language authority for user-facing text in this repository.
6
+ It defines ordinary word choice, sentence style, tone, punctuation, and prose form.
7
+
8
+ This text is an **ASD-STE100 Issue 9 conversational adaptation**. It applies the standard's
9
+ clear-writing principles to assistant messages. The official standard remains the authority for
10
+ definitions and dictionary decisions.
11
+
12
+ ## Official sources
13
+
14
+ - [ASD-STE100 Simplified Technical English, Issue 9 (2025-01-15)](https://www.asd-ste100.org/assets/files/ASD-STE100_ISSUE9.pdf)
15
+ - [ASD-STE100 FAQ](https://www.asd-ste100.org/STE_faq.html)
16
+ - [ASD-STE100 About page](https://www.asd-ste100.org/about_STE.html)
17
+ - [ASD-STE100 tools guidance](https://www.asd-ste100.org/STEsoftware.html)
18
+ - [STEMG white paper on ASD-STE100 and artificial intelligence](https://www.asd-ste100.org/assets/files/WhitePaper-ASD-STE100_and_AI.pdf)
19
+
20
+ ## Writing policy
21
+
22
+ - Write short, complete sentences. Keep one topic in each explanatory sentence.
23
+ - Use active voice. Put the condition first when an instruction has a prerequisite.
24
+ - Write imperative procedure steps. Give one action in each sentence.
25
+ - Prefer familiar, precise words. Use one stable term for one item or action.
26
+ - Write full words and explicit references. Expand abbreviations and contractions when they first appear.
27
+ - Replace ambiguous pronouns with the noun they name.
28
+ - Use inclusive, neutral language.
29
+ - Use periods, commas, colons, and bullets to show structure.
30
+ - Preserve exact quoted labels, identifiers, formulas, titles, and interface text.
31
+ - Send the reader only a result, a blocker, or a question. Leave out a line that says nothing is needed from them, and leave out which agent, session, or coordinator did the work.
32
+ - Use `WARNING` for a risk of injury or death. Use `CAUTION` for a risk of equipment, tool, or machine damage. State the command or condition first, then state the result.
33
+ - Aim for 20 words or fewer in a procedure sentence when the technical content allows.
34
+ - Aim for 25 words or fewer in a descriptive sentence when the technical content allows.
35
+
36
+ Use this policy for chat, tool narration, questions, plans, documentation, code-adjacent prose,
37
+ and durable repository text. Named contracts can add behavior-specific structure, evidence,
38
+ question routing, current-state documentation, completion, docstring, or publication rules.
39
+ Those contracts use this policy for their language.
40
+
41
+ Treat automated output and language checks as drafting aids. A responsible human verifies
42
+ technical accuracy, terminology, safety, confidentiality, and intended meaning.
@@ -0,0 +1,35 @@
1
+ Back to the [rule entry](../../rules/cleanup-temp-files.md).
2
+
3
+ # Clean up temporary files
4
+
5
+ **When this applies:** After tasks that created scratch files, debug dumps, or one-off scripts the user did not ask to keep.
6
+
7
+ Source: [Anthropic: Reduce file creation in agentic coding](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#reduce-file-creation-in-agentic-coding)
8
+
9
+ ## During a task
10
+
11
+ - Prefer working in memory over creating scratchpad files. Keep intermediate data in variables and tool results.
12
+ - When a temporary file is needed (e.g., a helper script, a test fixture, a debug output), track it mentally for cleanup.
13
+
14
+ ## When a task is complete
15
+
16
+ - Remove every temporary file, script, or helper file you created during the task.
17
+ - Leave the working directory cleaner than you found it.
18
+ - If a file was created at the user's explicit request (not as a byproduct of your process), leave it in place.
19
+
20
+ ## Exceptions to the removal duty
21
+
22
+ Three kinds of file are already ephemeral and need no explicit removal:
23
+
24
+ - A file under the OS temporary root.
25
+ - A file under `$CLAUDE_JOB_DIR`, which the harness clears with the job.
26
+ - A child agent's scratch file, which the parent removes at teardown.
27
+
28
+ Use an allowed removal form for everything else: [`destructive-commands.md`](../../rules/destructive-commands.md) names them.
29
+
30
+ ## What counts as temporary
31
+
32
+ - Scripts written to test a hypothesis or run a one-off check
33
+ - Debug output files, log dumps, or intermediate data exports
34
+ - Helper files created to work around tool limitations
35
+ - Any file the user did not ask for and would not expect to find after the task
@@ -0,0 +1,112 @@
1
+ Back to the [rule entry](../../rules/correction-lens.md).
2
+
3
+ # Correction lens
4
+
5
+ **Standing rule. This file is never archived and never removed.** The permanence
6
+ clause at the end of this document states what that binds.
7
+
8
+ **When this applies:** Every correction the user gives. A "no, do it this way", a
9
+ "stop writing that word", a repeated review comment, a fix the user makes by hand
10
+ after an agent hands work back. Each one is evidence that a control is missing,
11
+ and the correction is handled by building that control.
12
+
13
+ ## Rule
14
+
15
+ A correction runs through five layers, in this order, and the lesson lands at the
16
+ highest layer that can hold it. The change opens in the same run as the
17
+ correction.
18
+
19
+ | Priority | Layer | What holds the lesson | The lesson lands as |
20
+ |---|---|---|---|
21
+ | 1 | Codebase | The mistake is impossible by how the code is written | A type, a signature, a data structure, an API shape, a deleted branch |
22
+ | 2 | Static analysis | A program reads the tree and decides | A lint rule, an enforcer check, a paired test, a CI gate |
23
+ | 3 | Review tooling | A reviewer or a review bot reads the criterion | A `CODE_RULES.md` row, a `.cursor/BUGBOT.md` pointer, a Graphite or BugBot rule |
24
+ | 4 | Skill | An agent follows a procedure | A skill under the agents home |
25
+ | 5 | Style guide | Word choice and prose shape | A row in a `rules/*.md` file or a style document |
26
+
27
+ Layer 1 is the goal every time. A lesson encoded there needs no reader, no run,
28
+ and no agent to remember it. The wrong call has nowhere to live.
29
+
30
+ ## Choosing the layer
31
+
32
+ Three sentences close every correction:
33
+
34
+ 1. The layer chosen.
35
+ 2. Why each higher layer cannot hold this lesson.
36
+ 3. The change opened at the chosen layer, by pull request.
37
+
38
+ A layer holds a lesson when its own test passes:
39
+
40
+ - **Layer 1 holds it** when a type, a signature, or a data structure can make the
41
+ wrong call fail to compile, fail to construct, or fail to exist.
42
+ - **Layer 2 holds it** when a program reading the tree can separate right from
43
+ wrong with no judgment call.
44
+ - **Layer 3 holds it** when a reader needs the criterion in front of them and a
45
+ program cannot decide it.
46
+ - **Layer 4 holds it** when the lesson is a procedure with steps an agent runs.
47
+ - **Layer 5 holds it** when the lesson is word choice or the shape of prose.
48
+
49
+ Effort rules out no layer. A layer is ruled out when it lacks the capability to
50
+ hold the lesson, and the sentence that rules it out says which capability is
51
+ missing. "A lint for this would take a day" leaves layer 2 in play.
52
+
53
+ Two layers often hold one correction. Take both: the shape at layer 1 and the
54
+ check at layer 2 cost one run together and each covers what the other misses.
55
+
56
+ ## A repeated correction moves up a layer
57
+
58
+ The same correction arriving a second time is the measurement. The layer chosen
59
+ the first time was too low. Move the lesson one layer up and say so in the same
60
+ run.
61
+
62
+ A review comment that repeats across pull requests reads the same way. Each
63
+ repetition names the layer below the reviewer as the one that needs the control.
64
+ Count the repetitions.
65
+
66
+ ## Where the control lands
67
+
68
+ A control lands in the repository whose code, CI, or pipeline it guards. A
69
+ control for one repository's workflows, review bots, pipelines, or agents lands
70
+ in that repository. This package takes only repo-agnostic controls, the
71
+ environment and development pieces any repository could use, so every session
72
+ that loads this environment carries them. A control written into one project's
73
+ instructions reaches that project alone, and a control written into a chat reply
74
+ reaches that conversation alone.
75
+
76
+ Memory holds the decision. The control holds the behavior. A correction that
77
+ produced a memory file and nothing else has been recorded and never encoded, so
78
+ the rule still binds. Open the control.
79
+
80
+ ## Trust grows as the controls catch the common mistakes
81
+
82
+ Add agents after the controls catch what agents get wrong, and start from a
83
+ workflow small enough to watch. Each repeated correction becomes a stronger
84
+ control, and the number of agents rises behind it.
85
+ [`docs/high-trust-agent-delivery.md`](../high-trust-agent-delivery.md)
86
+ carries the model this comes from, including the layered-controls picture and
87
+ the inner and outer delivery loops.
88
+
89
+ ## Permanence
90
+
91
+ This file stays in `rules/`. A prune pass, an archive sweep, a consolidation, or
92
+ a rewrite that would move it into `rules-archived/` stops at this line. The
93
+ "Never archived" section of
94
+ [`packages/claude-dev-env/rules-archived/ARCHIVE-MANIFEST.md`](../../rules-archived/ARCHIVE-MANIFEST.md)
95
+ names it, and
96
+ [`archiving-agent-config.md`](../../rules/archiving-agent-config.md) names the same
97
+ exemption from the archiving procedure's side.
98
+
99
+ An edit that sharpens this rule is welcome. The file stays.
100
+
101
+ ## Codex copy
102
+
103
+ Codex reads its repository `AGENTS.md`. The standalone excerpt it receives lives in [`docs/rule-guides/correction-lens-excerpt.md`](correction-lens-excerpt.md).
104
+
105
+ ## Sibling rules
106
+
107
+ | Rule | Role |
108
+ |---|---|
109
+ | [`flag-non-breaking-findings.md`](../../rules/flag-non-breaking-findings.md) | A gate blocks on a breaking finding and records a smell |
110
+ | [`code-standards.md`](../../rules/code-standards.md) | The layer map of contract, pointer, enforcer, lint, session rules |
111
+ | [`archiving-agent-config.md`](../../rules/archiving-agent-config.md) | How a rule leaves service, and which files are exempt |
112
+ | [`falsify-before-green.md`](../../rules/falsify-before-green.md) | A new layer-2 check counts once it has run red on a named break |
@@ -0,0 +1,49 @@
1
+ Back to the [rule entry](../../rules/destructive-commands.md).
2
+
3
+ # Destructive commands in Bash
4
+
5
+ No hook watches Bash commands for destructive patterns. What you face is the harness permission prompt. The harness raises it from the session permission mode and the permission rules in effect on your host. In a background or auto-mode run no human can answer that prompt, so the call stalls.
6
+
7
+ Two consequences follow. Use an allowed removal form, and keep a destructive literal out of the command string even when it rides only as data.
8
+
9
+ ## Removal forms to prefer
10
+
11
+ - **Scratch and probe files.** Use the PowerShell tool with `Remove-Item -Recurse -Force -Confirm:$false <absolute path>`.
12
+ - **Worktrees.** Use `git worktree remove --force <path>`.
13
+ - **Tracked files.** Use `git rm <path>`, which records the deletion in the index.
14
+ - **Bash `rm` when unavoidable.** Write one standalone `rm` with absolute literal paths, no chaining, and no globs. Keep every target inside the ephemeral namespace below.
15
+
16
+ ## The ephemeral namespace
17
+
18
+ Keep a Bash `rm` to targets that resolve inside one of these:
19
+
20
+ - The OS temporary root.
21
+ - A path rooted at `/tmp` or `/temp`, drive-letter tolerant.
22
+ - A path holding a `/worktrees/` or `/worktree/` segment, or a directory git reports inside a worktree admin directory.
23
+ - `~/.claude`.
24
+
25
+ Never pass a bare ephemeral root, such as `/tmp`, the OS temp root itself, or a bare directory named `worktrees` or `worktree`. A single stray argument then wipes the whole namespace.
26
+
27
+ Write each target as a literal path. A variable, a `$(...)` or backtick expansion, or a brace glob hides what the command will delete from the reader and from the permission matcher.
28
+
29
+ A file left in the OS temp directory or under `$CLAUDE_JOB_DIR` is cleaned by the harness and needs no explicit removal. See the exception clause in [`cleanup-temp-files.md`](../../rules/cleanup-temp-files.md).
30
+
31
+ ## Keep destructive literals out of the command string
32
+
33
+ The permission matcher reads the raw command string. A destructive literal carried only as data still sits in that string, so it can push the command out of an allowed shape and into a prompt even though the shell never executes it. This covers a commit message, a PR or issue body, an echoed string, a `python -c` or `node -e` or `awk` argument, and a heredoc.
34
+
35
+ - Bodies that describe destructive-command behavior go in a file passed by path, such as `git commit -F <file>` or `gh … --body-file <file>`. See [`gh-cli-conventions.md`](../../rules/gh-cli-conventions.md). Never `git commit -m` or `gh … -b`.
36
+ - To exercise or verify a hook, run the committed test suite with `python -m pytest <test_file>`, which passes the command strings as in-language data. Never an inline `python -c` harness.
37
+
38
+ ## Every subagent prompt carries the rule
39
+
40
+ A prompt-delivered directive reaches only the agent that gets it. An agent that spawns its own workers, such as review lenses, fix agents, or verifiers, copies this line into every subagent prompt it issues. A grandchild cleaning up its own probe file then uses an allowed form:
41
+
42
+ > Never use bash rm in any form. Delete scratch/probe files with the PowerShell tool (Remove-Item -Recurse -Force -Confirm:$false <absolute path>), or leave them in the OS temp dir; remove worktrees only via git worktree remove --force.
43
+
44
+ Prefer that a child leaves its scratch files for the parent to remove at teardown.
45
+
46
+ ## Sibling rules
47
+
48
+ - [`cleanup-temp-files.md`](../../rules/cleanup-temp-files.md) names which scratch files a task removes, and which it leaves.
49
+ - [`windows-filesystem-safe.md`](../../rules/windows-filesystem-safe.md) holds the safe `rmtree` and `force_rmtree` patterns for read-only Windows files.
@@ -0,0 +1,27 @@
1
+ Back to the [rule entry](../../rules/explore-thoroughly.md).
2
+
3
+ # Explore thoroughly
4
+
5
+ Source: [Anthropic - Overthinking and Excessive Thoroughness](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#overthinking-and-excessive-thoroughness)
6
+
7
+ Note: This deliberately chooses exploration depth over the "commit and execute quickly" pattern from the same source. Thorough upfront exploration is preferred for the intended workflow.
8
+
9
+ ## Before committing to an approach
10
+
11
+ - Read the relevant files. Understand what exists before proposing what to change.
12
+ - Map the existing patterns: naming conventions, file organization, architectural decisions.
13
+ - Identify constraints that could invalidate an approach before investing effort in it.
14
+
15
+ ## Exploration scales with risk
16
+
17
+ - Small change to a familiar file: a quick read of the file and its immediate neighbors is enough.
18
+ - New feature or cross-cutting change: read broadly across the codebase to understand how similar things are done.
19
+ - Architectural decision: explore the full landscape before recommending a direction.
20
+
21
+ ## Inside an autonomous run
22
+
23
+ The depth budget shrinks once the evidence is in hand. When you can already name the files, the constraints, and what success looks like, further reading buys nothing: act. Re-reading a file to re-derive a fact the run already settled is the shape to cut. See [`long-horizon-autonomy.md`](../../rules/long-horizon-autonomy.md).
24
+
25
+ ## Relationship to other rules
26
+
27
+ - **research-mode.md** ensures factual claims are grounded. This rule ensures implementation plans are grounded in the codebase.
@@ -0,0 +1,53 @@
1
+ Back to the [rule entry](../../rules/filesystem-search.md).
2
+
3
+ # Filesystem search
4
+
5
+ **When this applies:** Any search for files by name, path, extension, size, or date. That includes `es.exe`, a shell `find`, a recursive `Get-ChildItem` / `gci` / `dir` / `ls -R`, or the harness Grep and Glob tools.
6
+
7
+ ## The scope invariant
8
+
9
+ Every filesystem search names a scope. A scope is a project, worktree, or package directory under the work in progress, or a filter that narrows the walk: an `ext:` filter, a `dm:` date filter, a `size:` filter, or a name pattern.
10
+
11
+ A search that starts at the filesystem root, a drive root, bare home, or a network share is out of bounds. Narrow it to what you need.
12
+
13
+ ## Choosing a tool
14
+
15
+ Three tools are equally sanctioned; pick by what you know:
16
+
17
+ | You know | Use |
18
+ |---|---|
19
+ | The exact path | `Read`. Do not search. |
20
+ | A name, extension, or date, on Windows | `es.exe` with a path scope |
21
+ | A name or path pattern | The harness `Glob` tool |
22
+ | Text inside files | The harness `Grep` tool |
23
+
24
+ When `es.exe` returns Error 8, retry the same search twice before any fallback. Error 8 reports a missing IPC client window, which leaves the index state unknown. After those retries fail, report that the Everything IPC client did not answer and that the service state was not probed, then fall back to `Glob` or `Grep` with the same scope. When `es.exe` is missing, or a later search returns no hits, fall back to `Glob` or `Grep`. Ask the user only after all three tools fail.
25
+
26
+ `skills/everything-search/SKILL.md` holds the full `es.exe` operator reference: `ext:`, `dm:`, `size:`, wildcards, OR/AND/NOT, output flags, and the junction and drive-mapping note.
27
+
28
+ ## Allowed and denied shapes
29
+
30
+ | Allowed | Example |
31
+ |---|---|
32
+ | Cwd-relative | `find . -iname '*.py'` |
33
+ | Project path | `find packages/claude-dev-env -name code_rules_gate.py` |
34
+ | Git Bash scoped path | `find /c/Users/<you>/repo -iname SKILL.md` |
35
+ | Recursive listing under a project | `Get-ChildItem -Path .\src -Recurse` |
36
+ | Scoped Windows index search | `es.exe path:C:\dev\repo ext:py gate` |
37
+
38
+ | Denied | Example |
39
+ |---|---|
40
+ | Filesystem root | `find / -iname code_rules_gate.py` |
41
+ | Git Bash drive root | `find /c -name '*.py'` |
42
+ | Windows drive root | `find C:\ -name foo` / `Get-ChildItem C:\ -Recurse` |
43
+ | Bare home | `find ~ -name README.md` / `find $HOME -type f` |
44
+ | Network share root | `find //server/share -name x`. A path under the share (`//server/share/project/src`) is allowed |
45
+
46
+ ## Shell batching
47
+
48
+ Issue one shell search at a time when the walk is large. Parallel full-tree searches contend for the shell and can lock the host. Harness `Grep` and `Glob` calls carry no such cost and run in parallel freely.
49
+
50
+ ## Search controls
51
+
52
+ - No hook denies a walk from an unscoped root. The scope invariant above is guidance a reader follows.
53
+ - For Everything searches that use a project name, run `python "${CLAUDE_SKILL_DIR}/scripts/everything_search.py" <project-name> <search arguments>`. An exact project name becomes its path from `~/.claude/project-paths.json`. The command then starts `es.exe` without a shell. `scripts/setup_project_paths.py` writes the registry.
@@ -0,0 +1,59 @@
1
+ Back to the [rule entry](../../rules/memory-stores-durable-facts.md).
2
+
3
+ # Memory stores durable facts
4
+
5
+ **When this applies:** Before you write or update a file in an auto-memory
6
+ directory, and before you add its line to `MEMORY.md`.
7
+
8
+ ## Rule
9
+
10
+ A memory must still help a fresh session, with no context, weeks later.
11
+
12
+ Run one test on the draft. Strip every date, pull request number, issue number,
13
+ commit, job path, session ID, and task number. When what remains is empty or
14
+ false, the draft is run state. Put it in the task tracker, the pull request, or
15
+ a handoff file beside the work, and save no memory.
16
+
17
+ ## What never becomes a memory
18
+
19
+ | Shape | Example | Where it belongs |
20
+ |---|---|---|
21
+ | Run or program state | "paused at", "resume from", "4 of 11 merged", a pointer to a handoff file | The task tracker or the handoff file |
22
+ | A pull request, issue, stack, or commit map | "#583, #605, #610 merged" | The epic issue or the pull request |
23
+ | A temporary condition | A concurrency schedule, credits out, a fleet that works this week, a fix "until X lands" | The current conversation |
24
+ | One session's topology | A session ID, a parallel session's worktree, a second-account dispatch setup | The current conversation |
25
+ | A workaround for a hook, gate, or verifier as it behaved one day | "the minter never fires, so skip the check" | A fix to the hook, per [`correction-lens.md`](../../rules/correction-lens.md) |
26
+ | The story of one incident or bug fix | "the fold checkbox took five tries" | Git history and the pull request body |
27
+ | Where code lives, or a design recipe for one build phase | A module layout, a prompt recipe for one engine version | The repository and its inventories |
28
+ | A restatement of a rule file | "CI owns the gate" | The rule file already loaded |
29
+
30
+ ## What a memory holds
31
+
32
+ - A preference or standing order the user stated, with the date the user set it.
33
+ - A trap in the local setup or the platform that persists, such as a shared
34
+ `rr-cache` that replays one-sided resolutions without a marker.
35
+ - A pointer to an external resource: a dashboard, a repository, a tracker.
36
+
37
+ Write the fact first. A date belongs only on a rule the user set on that date.
38
+
39
+ ## Keeping the folder current
40
+
41
+ When a memory goes stale, delete it and its `MEMORY.md` line in the same run.
42
+ A "superseded" note on a stale memory keeps a false fact loading into every
43
+ session.
44
+
45
+ ## Why
46
+
47
+ One project's memory folder held 104 index entries. A cleanup pass removed 57
48
+ of them, and each one failed the test above. Handoffs outlived their work,
49
+ pull request maps named merged branches, and a capacity schedule and a
50
+ dispatch topology contradicted newer standing orders. Every stale memory loads
51
+ into each session and reads as current.
52
+
53
+ ## Sibling rules
54
+
55
+ | Rule | Role |
56
+ |---|---|
57
+ | [`correction-lens.md`](../../rules/correction-lens.md) | A memory records a decision, and the control holds the behavior |
58
+ | [`verify-before-asking.md`](../../rules/verify-before-asking.md) | A recalled fact is a claim to re-check |
59
+ | [`cleanup-temp-files.md`](../../rules/cleanup-temp-files.md) | Scratch output leaves with the task |
@@ -0,0 +1,70 @@
1
+ Back to the [rule entry](../../rules/no-contrast-framing.md).
2
+
3
+ # No contrast framing
4
+
5
+ **When this applies:** Every sentence a person reads. A chat reply, a commit
6
+ message, a pull request title or body, a review comment, an issue, a rule file,
7
+ a document, a plan, a memory file.
8
+
9
+ ## Rule
10
+
11
+ State the chosen point. Leave the rejected reading out.
12
+
13
+ A contrast defines its subject against something the writer already decided
14
+ against, so the reader carries two readings where one would do, and the second
15
+ one is the writer's own discarded draft. The sentence says more and shows less.
16
+
17
+ Six forms carry the whole ban. Each row names the form the check reports.
18
+
19
+ | Form | Shape | Write this |
20
+ |---|---|---|
21
+ | `trailing-comma-not` | `a diff regression, not shared infrastructure` | `a diff regression` |
22
+ | `corrective-it-is-not` | `it is not a flake, it is a bug` | `a bug`, then the evidence that shows it |
23
+ | `substitution-rather-than` | `park it rather than fix it` | `park it` |
24
+ | `additive-not-just` | `not just for today` | the point the sentence was building toward |
25
+ | `comparative-ranking` | `being precise matters more than trying to cover them` | `be precise about these three` |
26
+ | `substitution-as-opposed-to` | `a warning as opposed to a failure` | `a warning` |
27
+
28
+ A comparison of quantities stays. "The function runs more than 30 lines" counts
29
+ lines. The ban covers the comparison that ranks one course of action over
30
+ another the writer is turning down.
31
+
32
+ Three shapes stay quiet by design. A backticked span or a fenced block carries
33
+ an example, so the check blanks it first. A line opening with `>` quotes
34
+ someone else, whose words are theirs to write. A `, not` clause reports only
35
+ when no bare `not` already sits earlier in the line, so a list of clauses
36
+ reports its first `, not` and stays quiet on the rest, as in
37
+ `a diff regression, not shared code, not a workaround`. A list whose own
38
+ opening word is a bare `not`, as in "not in chat, not in a commit message, not
39
+ in a body", keeps even its first `, not` quiet. A release automation body
40
+ passes the post linter untouched, since the bot builds it from commit
41
+ subjects and reads it back as machine input.
42
+
43
+ When the sentence thins after the contrast comes out, the missing piece is
44
+ evidence. Name it: the failing check, the log line, the measured number, the
45
+ file and the line.
46
+
47
+ ## Where it is enforced
48
+
49
+ | Surface | What runs |
50
+ |---|---|
51
+ | Authored Markdown in the repository | The staged policy lint's `contrast-framing` rule, on every changed file, graded against the file's prior text |
52
+ | A pull request or issue title and body, and a comment | `scripts/durable_post_lint.py`, which every post passes through before it reaches GitHub |
53
+ | A chat reply | The writer, reading the sentence back before sending |
54
+
55
+ The pattern list lives in
56
+ `scripts/dev_env_scripts_constants/contrast_framing_constants.py`, and both
57
+ lints read that one list. A synchronization test requires a row in the table
58
+ above for every form the list carries.
59
+
60
+ A chat reply reaches no check, so the same list is what the writer reads the
61
+ sentence against: a comma followed by `not`, a `rather than`, a `not just`, a
62
+ ranking of one thing over another.
63
+
64
+ ## Sibling rules
65
+
66
+ | Rule | Role |
67
+ |---|---|
68
+ | [`asd-ste100-language.md`](../../rules/asd-ste100-language.md) | Plain word choice, sentence style, and tone |
69
+ | [`correction-lens.md`](../../rules/correction-lens.md) | Every correction becomes a control at the highest layer that can hold it |
70
+ | [`research-mode.md`](../../rules/research-mode.md) | A claim carries its source |
@@ -0,0 +1,31 @@
1
+ Back to the [rule entry](../../rules/research-mode.md).
2
+
3
+ # Research mode (global)
4
+
5
+ Three anti-hallucination constraints are always active.
6
+
7
+ Source: [Anthropic - Reduce Hallucinations](https://docs.anthropic.com/en/docs/test-and-evaluate/strengthen-guardrails/reduce-hallucinations)
8
+
9
+ ## 1. Say "I don't know"
10
+ If you don't have a credible source for a claim, say so. Don't guess. Don't infer. "I don't have data on this" is always a valid answer.
11
+
12
+ ## 2. Verify with citations
13
+ Every recommendation, claim, or piece of advice must cite a specific source:
14
+ - A file in the current project
15
+ - An external source found via web search (with URL)
16
+ - A named expert, paper, or researcher
17
+ - Official documentation
18
+
19
+ If you generate a claim and cannot find a supporting source, retract it. Do not present it.
20
+
21
+ Check a citation against what the source says. A named authority attached to a claim the authority does not make is weaker than no citation at all, because it stops the reader from asking. This bites hardest on numbers: a threshold that runs stricter or looser than its source is a house call, so label it as one and leave the attribution to the direction the source does support.
22
+
23
+ ## 3. Direct quotes for factual grounding
24
+ When working from documents, extract the text first before analyzing. Ground your response in word-for-word quotes. Reference the quote when making your point.
25
+
26
+ ## How citations appear in a chat reply
27
+
28
+ The grounding requirement above never relaxes: state no claim you cannot source. What changes with the channel is how much of the source you print. A chat reply carries the source in compact form: a linked source name, or a `file:line` reference. Word-for-word quotes and full citation lists belong in artifacts, PR bodies, and issue bodies, or in a reply when the user asks for them.
29
+
30
+ ## Exceptions
31
+ Creative thinking, brainstorming, and novel ideas don't require citation. You can synthesize across sources to reach new conclusions, but the inputs must be grounded.
@@ -0,0 +1,54 @@
1
+ Back to the [rule entry](../../rules/verify-before-asking.md).
2
+
3
+ # Verify before asking
4
+
5
+ **When this applies:** Before asking the user any clarifying question during discovery, scoping, or implementation planning.
6
+
7
+ ## Rule
8
+
9
+ If a question can be answered by inspecting files, running a command, querying a database, reading a config, or using any available tool, answer it yourself. Only ask the user questions that require their judgment, preference, or knowledge that is not accessible to automated inspection.
10
+
11
+ ## Decision checklist
12
+
13
+ Before using the current session's native question tool or asking a clarifying question in chat, evaluate:
14
+
15
+ | Check | Action |
16
+ |---|---|
17
+ | Does the answer live in a file on disk? | Read the file. |
18
+ | Does the answer live in a directory structure? | List the directory. |
19
+ | Does the answer live in a database? | Query the database. |
20
+ | Does the answer live in git history? | Run `git log` or `git blame`. |
21
+ | Is the answer determined by file naming patterns or contents? | Glob a sample and inspect. |
22
+ | Is the answer a value in a config or environment variable? | Read the config or check the env. |
23
+ | Is the answer retrievable from any available MCP tool? | Use the tool. |
24
+ | Did the user already state a criterion, standard, or line that decides this? | Apply it, state the call and the reason, and keep going. |
25
+
26
+ Only after confirming the answer cannot be obtained through any available tool, ask the user. Present the question using [Present questions clearly](../../rules/question-presentation.md).
27
+
28
+ ## Prior-session facts expire
29
+
30
+ A path, port, branch name, or config value you recall from an earlier session counts as unanswered until a tool re-checks it this session. Memory records past state; the file may have moved, the port may be down, the branch may have merged. Treat every recalled fact as a claim to re-ground.
31
+
32
+ - When a tool can settle it, re-check in silence and act on the fresh result: no question to the user.
33
+ - When no tool can settle it and the user has a stake in the answer, use the current session's native question tool when available.
34
+
35
+ ## Questions that belong to the user
36
+
37
+ Reserve user questions for:
38
+ - **Preferences**: "Do you want approach A or B?" when both are viable and the user has a stake.
39
+ - **Missing context the user holds**: passwords, account names, intent, future plans.
40
+ - **Judgment calls**: tradeoffs the user needs to evaluate.
41
+ - **Scope decisions**: what to include or exclude from a piece of work.
42
+
43
+ A preference question is one where the user has not yet given the line. Once they have, every case under that line is yours to decide. Handing back each application of a stated criterion turns one decision into many and stalls the work, because the person who set the standard does not hold the individual answers. Apply the criterion, name the call and the reason it went that way, and escalate only what the criterion cannot settle: a new axis it never covered, or a step nobody can undo. [`long-horizon-autonomy.md`](../../rules/long-horizon-autonomy.md) carries the same duty for authority the task already granted.
44
+
45
+ ## Examples
46
+
47
+ **Wrong:** "Are there multiple images per folder, or just one image + one mp4?"
48
+ **Right:** List the folder contents directly, then state what was found.
49
+
50
+ **Wrong:** "What columns does the themes table have?"
51
+ **Right:** Query `information_schema.columns` and report the schema.
52
+
53
+ **Wrong:** "Is there a Prisma schema in this project?"
54
+ **Right:** Glob for `schema.prisma` and check.
@@ -0,0 +1,44 @@
1
+ Back to the [rule entry](../../rules/verify-runtime-state.md).
2
+
3
+ # Verify runtime state
4
+
5
+ **When this applies:** Before stating that a component is fine, healthy, innocent, or working: during debugging, triage, or any judgment about whether something runs.
6
+
7
+ ## Rule
8
+
9
+ A verdict that a component is fine or not the cause rests on live evidence gathered this session: a process list, a port probe, a log tail, an HTTP status code, or a fresh repro. Reading the code, recalling how the component behaved earlier, or trusting a prior session's finding does not settle whether it runs right now. Code shows what should happen; only a live probe shows what does.
10
+
11
+ Gather the probe before you write the verdict. When the probe contradicts the code (the code looks right but the port refuses the connection), report the live result and treat the component as suspect.
12
+
13
+ A status field is a report. An exit code, a green pipeline run, and a task result all say the work finished. They do not say the work happened. Read the thing the work was meant to make.
14
+
15
+ Some evidence lasts only a moment. When a user shows you a failure, read the source they already hold: the terminal itself, and any log file the error names. A fresh probe minutes later measures a different moment, and a system that healed in between hides the failure you were asked about.
16
+
17
+ ## Grounding checklist
18
+
19
+ Before stating a runtime claim, gather the matching live signal:
20
+
21
+ | Claim | Grounding probe |
22
+ |---|---|
23
+ | The service is healthy | Hit its health endpoint and read the status code. |
24
+ | The config is in effect | Print the loaded config at runtime and read the value. |
25
+ | The server is up | Probe the port; a refused connection means it is down. |
26
+ | The process is running | List processes and match the name or PID. |
27
+ | The change took effect | Drive the flow and watch the new behavior. A script that proves a branch's behavior names the module file it loaded, as its first step, because an installed copy of the same package shadows the checkout you meant to test. |
28
+ | The dependency is reachable | Send one request and read the response. |
29
+ | The release or deploy shipped | Read what it makes: the tag, the published version, the file on disk. |
30
+ | The pipeline did the work | Read each job's own result. A run reports success while a job inside it is skipped. |
31
+ | The automation works | Drive the branch that matters. A green run of the do-nothing branch proves nothing. |
32
+
33
+ Only after a live signal backs the claim do you state it.
34
+
35
+ ## Examples
36
+
37
+ **Wrong:** "The search server code looks correct, so it is not the problem."
38
+ **Right:** Probe port 54321; report "connection refused: the server is down."
39
+
40
+ **Wrong:** "This function handles the retry, so the request must be going through."
41
+ **Right:** Tail the request log and confirm the retry fired, or report that no retry line appears.
42
+
43
+ **Wrong:** "The config sets the timeout to 30 seconds, so the timeout is fine."
44
+ **Right:** Print the loaded config at runtime and report the value the process holds.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "8.37.0",
3
+ "version": "8.37.1",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,40 +1,9 @@
1
- # ASD-STE100 Language Policy
1
+ # ASD-STE100 language policy
2
2
 
3
- Use this rule as the sole general language authority for user-facing text in this repository.
4
- It defines ordinary word choice, sentence style, tone, punctuation, and prose form.
3
+ **When:** Writing chat, tool narration, or repository prose.
5
4
 
6
- This text is an **ASD-STE100 Issue 9 conversational adaptation**. It applies the standard's
7
- clear-writing principles to assistant messages. The official standard remains the authority for
8
- definitions and dictionary decisions.
5
+ Use the sole general language rule. Write short, complete sentences on one topic. Use active voice; lead with conditions; give one action per step. Use plain, precise words and stable terms. Expand abbreviations and contractions first; name unclear pronouns. Be inclusive; punctuate clearly. Preserve exact labels, identifiers, formulas, titles, and interface text. Send a result, blocker, or question. Mark injury or death `WARNING`, equipment damage `CAUTION`; state condition then result. Aim for 20 words per step, 25 per description. Treat checks as aids; have a human verify accuracy, terms, safety, confidentiality, and meaning.
9
6
 
10
- ## Official sources
7
+ **Enforcement:** none, the agent applies it.
11
8
 
12
- - [ASD-STE100 Simplified Technical English, Issue 9 (2025-01-15)](https://www.asd-ste100.org/assets/files/ASD-STE100_ISSUE9.pdf)
13
- - [ASD-STE100 FAQ](https://www.asd-ste100.org/STE_faq.html)
14
- - [ASD-STE100 About page](https://www.asd-ste100.org/about_STE.html)
15
- - [ASD-STE100 tools guidance](https://www.asd-ste100.org/STEsoftware.html)
16
- - [STEMG white paper on ASD-STE100 and artificial intelligence](https://www.asd-ste100.org/assets/files/WhitePaper-ASD-STE100_and_AI.pdf)
17
-
18
- ## Writing policy
19
-
20
- - Write short, complete sentences. Keep one topic in each explanatory sentence.
21
- - Use active voice. Put the condition first when an instruction has a prerequisite.
22
- - Write imperative procedure steps. Give one action in each sentence.
23
- - Prefer familiar, precise words. Use one stable term for one item or action.
24
- - Write full words and explicit references. Expand abbreviations and contractions when they first appear.
25
- - Replace ambiguous pronouns with the noun they name.
26
- - Use inclusive, neutral language.
27
- - Use periods, commas, colons, and bullets to show structure.
28
- - Preserve exact quoted labels, identifiers, formulas, titles, and interface text.
29
- - Send the reader only a result, a blocker, or a question. Leave out a line that says nothing is needed from them, and leave out which agent, session, or coordinator did the work.
30
- - Use `WARNING` for a risk of injury or death. Use `CAUTION` for a risk of equipment, tool, or machine damage. State the command or condition first, then state the result.
31
- - Aim for 20 words or fewer in a procedure sentence when the technical content allows.
32
- - Aim for 25 words or fewer in a descriptive sentence when the technical content allows.
33
-
34
- Use this policy for chat, tool narration, questions, plans, documentation, code-adjacent prose,
35
- and durable repository text. Named contracts can add behavior-specific structure, evidence,
36
- question routing, current-state documentation, completion, docstring, or publication rules.
37
- Those contracts use this policy for their language.
38
-
39
- Treat automated output and language checks as drafting aids. A responsible human verifies
40
- technical accuracy, terminology, safety, confidentiality, and intended meaning.
9
+ **Full text:** [`docs/rule-guides/asd-ste100-language.md`](../docs/rule-guides/asd-ste100-language.md). Read it for sources.
@@ -1,33 +1,9 @@
1
- # Clean Up Temporary Files
1
+ # Clean up temporary files
2
2
 
3
- **When this applies:** After tasks that created scratch files, debug dumps, or one-off scripts the user did not ask to keep.
3
+ **When:** Creating scratch files, debug dumps, or one-off helpers during a task.
4
4
 
5
- Source: [Anthropic — Reduce file creation in agentic coding](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#reduce-file-creation-in-agentic-coding)
5
+ Prefer memory to scratch files and track any temporary files you create. At completion, remove those files and leave user-requested files in place. Files under the OS temporary root or `$CLAUDE_JOB_DIR` need no explicit removal; a parent handles child-agent scratch. Use the permitted removal form.
6
6
 
7
- ## During a task
7
+ **Enforcement:** none, the agent applies it.
8
8
 
9
- - Prefer working in memory over creating scratchpad files. Use variables and tool results instead of writing intermediate data to disk.
10
- - When a temporary file is needed (e.g., a helper script, a test fixture, a debug output), track it mentally for cleanup.
11
-
12
- ## When a task is complete
13
-
14
- - Remove every temporary file, script, or helper file you created during the task.
15
- - Leave the working directory cleaner than you found it.
16
- - If a file was created at the user's explicit request (not as a byproduct of your process), leave it in place.
17
-
18
- ## Exceptions to the removal duty
19
-
20
- Three kinds of file are already ephemeral and need no explicit removal:
21
-
22
- - A file under the OS temporary root.
23
- - A file under `$CLAUDE_JOB_DIR`, which the harness clears with the job.
24
- - A child agent's scratch file, which the parent removes at teardown.
25
-
26
- Use an allowed removal form for everything else: [`destructive-commands.md`](destructive-commands.md) names them.
27
-
28
- ## What counts as temporary
29
-
30
- - Scripts written to test a hypothesis or run a one-off check
31
- - Debug output files, log dumps, or intermediate data exports
32
- - Helper files created to work around tool limitations
33
- - Any file the user did not ask for and would not expect to find after the task
9
+ **Full text:** [`docs/rule-guides/cleanup-temp-files.md`](../docs/rule-guides/cleanup-temp-files.md). Read it to classify a file or choose cleanup.
@@ -1,110 +1,21 @@
1
- # Correction Lens
1
+ # Correction lens
2
2
 
3
- **Standing rule. This file is never archived and never removed.** The permanence
4
- clause at the end of this document states what that binds.
3
+ **When:** A user corrects you.
5
4
 
6
- **When this applies:** Every correction the user gives. A "no, do it this way", a
7
- "stop writing that word", a repeated review comment, a fix the user makes by hand
8
- after an agent hands work back. Each one is evidence that a control is missing,
9
- and the correction is handled by building that control.
5
+ Open a control in the guarded repository, in the same run, at the highest capable layer. State the layer, why higher layers fail, and the change opened. Pair layers when both help. Move repeated corrections up a layer. Memory records the decision.
10
6
 
11
- ## Rule
12
-
13
- A correction runs through five layers, in this order, and the lesson lands at the
14
- highest layer that can hold it. The change opens in the same run as the
15
- correction.
16
-
17
- | Priority | Layer | What holds the lesson | The lesson lands as |
18
- |---|---|---|---|
19
- | 1 | Codebase | The mistake is impossible by how the code is written | A type, a signature, a data structure, an API shape, a deleted branch |
20
- | 2 | Static analysis | A program reads the tree and decides | A lint rule, an enforcer check, a paired test, a CI gate |
21
- | 3 | Review tooling | A reviewer or a review bot reads the criterion | A `CODE_RULES.md` row, a `.cursor/BUGBOT.md` pointer, a Graphite or BugBot rule |
22
- | 4 | Skill | An agent follows a procedure | A skill under the agents home |
23
- | 5 | Style guide | Word choice and prose shape | A row in a `rules/*.md` file or a style document |
24
-
25
- Layer 1 is the goal every time. A lesson encoded there needs no reader, no run,
26
- and no agent to remember it. The wrong call has nowhere to live.
27
-
28
- ## Choosing the layer
29
-
30
- Three sentences close every correction:
31
-
32
- 1. The layer chosen.
33
- 2. Why each higher layer cannot hold this lesson.
34
- 3. The change opened at the chosen layer, by pull request.
35
-
36
- A layer holds a lesson when its own test passes:
37
-
38
- - **Layer 1 holds it** when a type, a signature, or a data structure can make the
39
- wrong call fail to compile, fail to construct, or fail to exist.
40
- - **Layer 2 holds it** when a program reading the tree can separate right from
41
- wrong with no judgment call.
42
- - **Layer 3 holds it** when a reader needs the criterion in front of them and a
43
- program cannot decide it.
44
- - **Layer 4 holds it** when the lesson is a procedure with steps an agent runs.
45
- - **Layer 5 holds it** when the lesson is word choice or the shape of prose.
46
-
47
- Effort rules out no layer. A layer is ruled out when it lacks the capability to
48
- hold the lesson, and the sentence that rules it out says which capability is
49
- missing. "A lint for this would take a day" leaves layer 2 in play.
50
-
51
- Two layers often hold one correction. Take both: the shape at layer 1 and the
52
- check at layer 2 cost one run together and each covers what the other misses.
53
-
54
- ## A repeated correction moves up a layer
55
-
56
- The same correction arriving a second time is the measurement. The layer chosen
57
- the first time was too low. Move the lesson one layer up and say so in the same
58
- run.
59
-
60
- A review comment that repeats across pull requests reads the same way. Each
61
- repetition names the layer below the reviewer as the one that needs the control.
62
- Count the repetitions.
63
-
64
- ## Where the control lands
65
-
66
- A control lands in the repository whose code, CI, or pipeline it guards. A
67
- control for one repository's workflows, review bots, pipelines, or agents lands
68
- in that repository. This package takes only repo-agnostic controls, the
69
- environment and development pieces any repository could use, so every session
70
- that loads this environment carries them. A control written into one project's
71
- instructions reaches that project alone, and a control written into a chat reply
72
- reaches that conversation alone.
73
-
74
- Memory holds the decision. The control holds the behavior. A correction that
75
- produced a memory file and nothing else has been recorded and never encoded, so
76
- the rule still binds. Open the control.
77
-
78
- ## Trust grows as the controls catch the common mistakes
79
-
80
- Add agents after the controls catch what agents get wrong, and start from a
81
- workflow small enough to watch. Each repeated correction becomes a stronger
82
- control, and the number of agents rises behind it.
83
- [`docs/high-trust-agent-delivery.md`](../docs/high-trust-agent-delivery.md)
84
- carries the model this comes from, including the layered-controls picture and
85
- the inner and outer delivery loops.
7
+ | Priority | Layer | Control |
8
+ |---|---|---|
9
+ | 1 | Codebase | Prevent the mistake. |
10
+ | 2 | Static analysis | Programmatic check. |
11
+ | 3 | Review tooling | Reviewer criterion. |
12
+ | 4 | Skill | Agent procedure. |
13
+ | 5 | Style guide | Wording rule. |
86
14
 
87
15
  ## Permanence
88
16
 
89
- This file stays in `rules/`. A prune pass, an archive sweep, a consolidation, or
90
- a rewrite that would move it into `rules-archived/` stops at this line. The
91
- "Never archived" section of
92
- [`packages/claude-dev-env/rules-archived/ARCHIVE-MANIFEST.md`](../rules-archived/ARCHIVE-MANIFEST.md)
93
- names it, and
94
- [`archiving-agent-config.md`](archiving-agent-config.md) names the same
95
- exemption from the archiving procedure's side.
96
-
97
- An edit that sharpens this rule is welcome. The file stays.
98
-
99
- ## Codex copy
100
-
101
- Codex reads its repository `AGENTS.md`. The standalone excerpt it receives lives in [`docs/rule-guides/correction-lens-excerpt.md`](../docs/rule-guides/correction-lens-excerpt.md).
17
+ Keep this file in `rules/`. A prune, archive, consolidation, or rewrite that would move it stops here. Edits that sharpen it are welcome.
102
18
 
103
- ## Sibling rules
19
+ **Enforcement:** none, the agent applies it.
104
20
 
105
- | Rule | Role |
106
- |---|---|
107
- | [`flag-non-breaking-findings.md`](flag-non-breaking-findings.md) | A gate blocks on a breaking finding and records a smell |
108
- | [`code-standards.md`](code-standards.md) | The layer map of contract, pointer, enforcer, lint, session rules |
109
- | [`archiving-agent-config.md`](archiving-agent-config.md) | How a rule leaves service, and which files are exempt |
110
- | [`falsify-before-green.md`](falsify-before-green.md) | A new layer-2 check counts once it has run red on a named break |
21
+ **Full text:** [`docs/rule-guides/correction-lens.md`](../docs/rule-guides/correction-lens.md). Read it when choosing a layer or locating a control.
@@ -1,47 +1,11 @@
1
- # Destructive Commands in Bash
1
+ # Destructive commands in Bash
2
2
 
3
- No hook watches Bash commands for destructive patterns. What you face is the harness permission prompt. The harness raises it from the session permission mode and the permission rules in effect on your host. In a background or auto-mode run no human can answer that prompt, so the call stalls.
3
+ **When:** Removing files or writing a destructive command string.
4
4
 
5
- Two consequences follow. Use an allowed removal form, and keep a destructive literal out of the command string even when it rides only as data.
6
-
7
- ## Removal forms to prefer
8
-
9
- - **Scratch and probe files.** Use the PowerShell tool with `Remove-Item -Recurse -Force -Confirm:$false <absolute path>`.
10
- - **Worktrees.** Use `git worktree remove --force <path>`.
11
- - **Tracked files.** Use `git rm <path>`, which records the deletion in the index.
12
- - **Bash `rm` when unavoidable.** Write one standalone `rm` with absolute literal paths, no chaining, and no globs. Keep every target inside the ephemeral namespace below.
13
-
14
- ## The ephemeral namespace
15
-
16
- Keep a Bash `rm` to targets that resolve inside one of these:
17
-
18
- - The OS temporary root.
19
- - A path rooted at `/tmp` or `/temp`, drive-letter tolerant.
20
- - A path holding a `/worktrees/` or `/worktree/` segment, or a directory git reports inside a worktree admin directory.
21
- - `~/.claude`.
22
-
23
- Never pass a bare ephemeral root, such as `/tmp`, the OS temp root itself, or a bare directory named `worktrees` or `worktree`. A single stray argument then wipes the whole namespace.
24
-
25
- Write each target as a literal path. A variable, a `$(...)` or backtick expansion, or a brace glob hides what the command will delete from the reader and from the permission matcher.
26
-
27
- A file left in the OS temp directory or under `$CLAUDE_JOB_DIR` is cleaned by the harness and needs no explicit removal. See the exception clause in [`cleanup-temp-files.md`](cleanup-temp-files.md).
28
-
29
- ## Keep destructive literals out of the command string
30
-
31
- The permission matcher reads the raw command string. A destructive literal carried only as data still sits in that string, so it can push the command out of an allowed shape and into a prompt even though the shell never executes it. This covers a commit message, a PR or issue body, an echoed string, a `python -c` or `node -e` or `awk` argument, and a heredoc.
32
-
33
- - Bodies that describe destructive-command behavior go in a file passed by path, such as `git commit -F <file>` or `gh … --body-file <file>`. See [`gh-cli-conventions.md`](gh-cli-conventions.md). Never `git commit -m` or `gh … -b`.
34
- - To exercise or verify a hook, run the committed test suite with `python -m pytest <test_file>`, which passes the command strings as in-language data. Never an inline `python -c` harness.
35
-
36
- ## Every subagent prompt carries the rule
37
-
38
- A prompt-delivered directive reaches only the agent that gets it. An agent that spawns its own workers, such as review lenses, fix agents, or verifiers, copies this line into every subagent prompt it issues. A grandchild cleaning up its own probe file then uses an allowed form:
5
+ No hook watches Bash commands; a permission prompt can stall unattended work. Keep destructive literals out of command strings, including data. Use literal absolute targets; never target a bare temporary root. Use `git rm` for tracked files. Pass bodies by file and test hooks through the test suite. Copy this line into every subagent prompt:
39
6
 
40
7
  > Never use bash rm in any form. Delete scratch/probe files with the PowerShell tool (Remove-Item -Recurse -Force -Confirm:$false <absolute path>), or leave them in the OS temp dir; remove worktrees only via git worktree remove --force.
41
8
 
42
- Prefer that a child leaves its scratch files for the parent to remove at teardown.
43
-
44
- ## Sibling rules
9
+ **Enforcement:** none, the agent applies it; the harness may prompt.
45
10
 
46
- - [`cleanup-temp-files.md`](cleanup-temp-files.md) names which scratch files a task removes, and which it leaves.
47
- - [`windows-filesystem-safe.md`](windows-filesystem-safe.md) holds the safe `rmtree` and `force_rmtree` patterns for read-only Windows files.
11
+ **Full text:** [`docs/rule-guides/destructive-commands.md`](../docs/rule-guides/destructive-commands.md). Read it before any removal.
@@ -1,25 +1,9 @@
1
- # Explore Thoroughly
1
+ # Explore thoroughly
2
2
 
3
- Source: [Anthropic - Overthinking and Excessive Thoroughness](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#overthinking-and-excessive-thoroughness)
3
+ **When:** Choosing an implementation approach or recommending an architectural direction.
4
4
 
5
- Note: This deliberately chooses exploration depth over the "commit and execute quickly" pattern from the same source. Thorough upfront exploration is preferred for the intended workflow.
5
+ Read relevant files, map local patterns, and identify constraints before committing to an approach. Scale exploration to risk: inspect nearby files for a small change, broader examples for a new feature, and the full landscape for an architectural decision. Once the files, constraints, and success condition are known, act without repeating settled research.
6
6
 
7
- ## Before committing to an approach
7
+ **Enforcement:** none, the agent applies it.
8
8
 
9
- - Read the relevant files. Understand what exists before proposing what to change.
10
- - Map the existing patterns: naming conventions, file organization, architectural decisions.
11
- - Identify constraints that could invalidate an approach before investing effort in it.
12
-
13
- ## Exploration scales with risk
14
-
15
- - Small change to a familiar file: a quick read of the file and its immediate neighbors is enough.
16
- - New feature or cross-cutting change: read broadly across the codebase to understand how similar things are done.
17
- - Architectural decision: explore the full landscape before recommending a direction.
18
-
19
- ## Inside an autonomous run
20
-
21
- The depth budget shrinks once the evidence is in hand. When you can already name the files, the constraints, and what success looks like, further reading buys nothing — act. Re-reading a file to re-derive a fact the run already settled is the shape to cut. See [`long-horizon-autonomy.md`](long-horizon-autonomy.md).
22
-
23
- ## Relationship to other rules
24
-
25
- - **research-mode.md** ensures factual claims are grounded. This rule ensures implementation plans are grounded in the codebase.
9
+ **Full text:** [`docs/rule-guides/explore-thoroughly.md`](../docs/rule-guides/explore-thoroughly.md). Read it when setting exploration depth.
@@ -1,51 +1,9 @@
1
- # Filesystem Search
1
+ # Filesystem search
2
2
 
3
- **When this applies:** Any search for files by name, path, extension, size, or date. That includes `es.exe`, a shell `find`, a recursive `Get-ChildItem` / `gci` / `dir` / `ls -R`, or the harness Grep and Glob tools.
3
+ **When:** Searching for files by name, path, extension, size, or date.
4
4
 
5
- ## The scope invariant
5
+ Scope every search to a project, worktree, package, or narrowing filter. Never start at a filesystem root, drive root, bare home, or share root. Read a known path directly; use scoped `es.exe`, Glob, or Grep for discovery. After `es.exe` Error 8, retry twice before falling back within the same scope. Run one large shell walk at a time. Ask the user only after available search tools fail.
6
6
 
7
- Every filesystem search names a scope. A scope is a project, worktree, or package directory under the work in progress, or a filter that narrows the walk: an `ext:` filter, a `dm:` date filter, a `size:` filter, or a name pattern.
7
+ **Enforcement:** none, the agent applies it.
8
8
 
9
- A search that starts at the filesystem root, a drive root, bare home, or a network share is out of bounds. Narrow it to what you need.
10
-
11
- ## Choosing a tool
12
-
13
- Three tools are equally sanctioned; pick by what you know:
14
-
15
- | You know | Use |
16
- |---|---|
17
- | The exact path | `Read`. Do not search. |
18
- | A name, extension, or date, on Windows | `es.exe` with a path scope |
19
- | A name or path pattern | The harness `Glob` tool |
20
- | Text inside files | The harness `Grep` tool |
21
-
22
- When `es.exe` returns Error 8, retry the same search twice before any fallback. Error 8 is a missing IPC client window, not proof the index is down. After those retries fail, report that the Everything IPC client did not answer and that the service state was not probed, then fall back to `Glob` or `Grep` with the same scope. When `es.exe` is missing, or a later search returns no hits, fall back to `Glob` or `Grep`. Ask the user only after all three tools fail.
23
-
24
- `skills/everything-search/SKILL.md` holds the full `es.exe` operator reference: `ext:`, `dm:`, `size:`, wildcards, OR/AND/NOT, output flags, and the junction and drive-mapping note.
25
-
26
- ## Allowed and denied shapes
27
-
28
- | Allowed | Example |
29
- |---|---|
30
- | Cwd-relative | `find . -iname '*.py'` |
31
- | Project path | `find packages/claude-dev-env -name code_rules_gate.py` |
32
- | Git Bash scoped path | `find /c/Users/<you>/repo -iname SKILL.md` |
33
- | Recursive listing under a project | `Get-ChildItem -Path .\src -Recurse` |
34
- | Scoped Windows index search | `es.exe path:C:\dev\repo ext:py gate` |
35
-
36
- | Denied | Example |
37
- |---|---|
38
- | Filesystem root | `find / -iname code_rules_gate.py` |
39
- | Git Bash drive root | `find /c -name '*.py'` |
40
- | Windows drive root | `find C:\ -name foo` / `Get-ChildItem C:\ -Recurse` |
41
- | Bare home | `find ~ -name README.md` / `find $HOME -type f` |
42
- | Network share root | `find //server/share -name x`. A path under the share (`//server/share/project/src`) is allowed |
43
-
44
- ## Shell batching
45
-
46
- Issue one shell search at a time when the walk is large. Parallel full-tree searches contend for the shell and can lock the host. Harness `Grep` and `Glob` calls carry no such cost and run in parallel freely.
47
-
48
- ## Search controls
49
-
50
- - No hook denies a walk from an unscoped root. The scope invariant above is guidance a reader follows.
51
- - For Everything searches that use a project name, run `python "${CLAUDE_SKILL_DIR}/scripts/everything_search.py" <project-name> <search arguments>`. An exact project name becomes its path from `~/.claude/project-paths.json`. The command then starts `es.exe` without a shell. `scripts/setup_project_paths.py` writes the registry.
9
+ **Full text:** [`docs/rule-guides/filesystem-search.md`](../docs/rule-guides/filesystem-search.md). Read it for tool selection and search examples.
@@ -1,57 +1,9 @@
1
- # Memory Stores Durable Facts
1
+ # Memory stores durable facts
2
2
 
3
- **When this applies:** Before you write or update a file in an auto-memory
4
- directory, and before you add its line to `MEMORY.md`.
3
+ **When:** Writing auto-memory or adding a `MEMORY.md` entry.
5
4
 
6
- ## Rule
5
+ Keep only a fact that helps a fresh session weeks later. Remove dates, task identifiers, commits, and paths from a draft; if the remainder is empty or false, put it in the task tracker or handoff instead. Store standing user preferences, stable setup traps, and useful resource pointers. Delete stale memory and its index line in the same run.
7
6
 
8
- A memory must still help a fresh session, with no context, weeks later.
7
+ **Enforcement:** none, the agent applies it.
9
8
 
10
- Run one test on the draft. Strip every date, pull request number, issue number,
11
- commit, job path, session ID, and task number. When what remains is empty or
12
- false, the draft is run state. Put it in the task tracker, the pull request, or
13
- a handoff file beside the work, and save no memory.
14
-
15
- ## What never becomes a memory
16
-
17
- | Shape | Example | Where it belongs |
18
- |---|---|---|
19
- | Run or program state | "paused at", "resume from", "4 of 11 merged", a pointer to a handoff file | The task tracker or the handoff file |
20
- | A pull request, issue, stack, or commit map | "#583, #605, #610 merged" | The epic issue or the pull request |
21
- | A temporary condition | A concurrency schedule, credits out, a fleet that works this week, a fix "until X lands" | The current conversation |
22
- | One session's topology | A session ID, a parallel session's worktree, a second-account dispatch setup | The current conversation |
23
- | A workaround for a hook, gate, or verifier as it behaved one day | "the minter never fires, so skip the check" | A fix to the hook, per [`correction-lens.md`](correction-lens.md) |
24
- | The story of one incident or bug fix | "the fold checkbox took five tries" | Git history and the pull request body |
25
- | Where code lives, or a design recipe for one build phase | A module layout, a prompt recipe for one engine version | The repository and its inventories |
26
- | A restatement of a rule file | "CI owns the gate" | The rule file already loaded |
27
-
28
- ## What a memory holds
29
-
30
- - A preference or standing order the user stated, with the date the user set it.
31
- - A trap in the local setup or the platform that stays true, such as a shared
32
- `rr-cache` that replays one-sided resolutions without a marker.
33
- - A pointer to an external resource: a dashboard, a repository, a tracker.
34
-
35
- Write the fact first. A date belongs only on a rule the user set on that date.
36
-
37
- ## Keeping the folder current
38
-
39
- When a memory goes stale, delete it and its `MEMORY.md` line in the same run.
40
- A "superseded" note on a stale memory keeps a false fact loading into every
41
- session.
42
-
43
- ## Why
44
-
45
- One project's memory folder held 104 index entries. A cleanup pass removed 57
46
- of them, and each one failed the test above. Handoffs outlived their work,
47
- pull request maps named merged branches, and a capacity schedule and a
48
- dispatch topology contradicted newer standing orders. Every stale memory loads
49
- into each session and reads as current.
50
-
51
- ## Sibling rules
52
-
53
- | Rule | Role |
54
- |---|---|
55
- | [`correction-lens.md`](correction-lens.md) | A memory records a decision, and the control holds the behavior |
56
- | [`verify-before-asking.md`](verify-before-asking.md) | A recalled fact is a claim to re-check |
57
- | [`cleanup-temp-files.md`](cleanup-temp-files.md) | Scratch output leaves with the task |
9
+ **Full text:** [`docs/rule-guides/memory-stores-durable-facts.md`](../docs/rule-guides/memory-stores-durable-facts.md). Read it when deciding whether a fact belongs in memory.
@@ -1,68 +1,9 @@
1
- # No Contrast Framing
1
+ # No contrast framing
2
2
 
3
- **When this applies:** Every sentence a person reads. A chat reply, a commit
4
- message, a pull request title or body, a review comment, an issue, a rule file,
5
- a document, a plan, a memory file.
3
+ **When:** Writing any sentence a person reads.
6
4
 
7
- ## Rule
5
+ State the chosen point directly and leave out the discarded reading. Remove these six forms: `trailing-comma-not`, `corrective-it-is-not`, `substitution-rather-than`, `additive-not-just`, `comparative-ranking`, `substitution-as-opposed-to`. Keep quantity comparisons. If a sentence loses substance, add the failing check, log line, measured number, or file and line.
8
6
 
9
- State what is true. Leave the rejected reading out.
7
+ **Enforcement:** staged policy lint and `scripts/durable_post_lint.py` check authored text; the agent checks chat.
10
8
 
11
- A contrast defines its subject against something the writer already decided
12
- against, so the reader carries two readings where one would do, and the second
13
- one is the writer's own discarded draft. The sentence says more and shows less.
14
-
15
- Six forms carry the whole ban. Each row names the form the check reports.
16
-
17
- | Form | Shape | Write this |
18
- |---|---|---|
19
- | `trailing-comma-not` | `a diff regression, not shared infrastructure` | `a diff regression` |
20
- | `corrective-it-is-not` | `it is not a flake, it is a bug` | `a bug`, then the evidence that shows it |
21
- | `substitution-rather-than` | `park it rather than fix it` | `park it` |
22
- | `additive-not-just` | `not just for today` | the point the sentence was building toward |
23
- | `comparative-ranking` | `being precise matters more than trying to cover them` | `be precise about these three` |
24
- | `substitution-as-opposed-to` | `a warning as opposed to a failure` | `a warning` |
25
-
26
- A comparison of quantities stays. "The function runs more than 30 lines" counts
27
- lines. The ban covers the comparison that ranks one course of action over
28
- another the writer is turning down.
29
-
30
- Three shapes stay quiet by design. A backticked span or a fenced block carries
31
- an example, so the check blanks it first. A line opening with `>` quotes
32
- someone else, whose words are theirs to write. A `, not` clause reports only
33
- when no bare `not` already sits earlier in the line, so a list of clauses
34
- reports its first `, not` and stays quiet on the rest, as in
35
- `a diff regression, not shared code, not a workaround`. A list whose own
36
- opening word is a bare `not`, as in "not in chat, not in a commit message, not
37
- in a body", keeps even its first `, not` quiet. A release automation body
38
- passes the post linter untouched, since the bot builds it from commit
39
- subjects and reads it back as machine input.
40
-
41
- When the sentence thins after the contrast comes out, the missing piece is
42
- evidence. Name it: the failing check, the log line, the measured number, the
43
- file and the line.
44
-
45
- ## Where it is enforced
46
-
47
- | Surface | What runs |
48
- |---|---|
49
- | Authored Markdown in the repository | The staged policy lint's `contrast-framing` rule, on every changed file, graded against the file's prior text |
50
- | A pull request or issue title and body, and a comment | `scripts/durable_post_lint.py`, which every post passes through before it reaches GitHub |
51
- | A chat reply | The writer, reading the sentence back before sending |
52
-
53
- The pattern list lives in
54
- `scripts/dev_env_scripts_constants/contrast_framing_constants.py`, and both
55
- lints read that one list. A synchronization test requires a row in the table
56
- above for every form the list carries.
57
-
58
- A chat reply reaches no check, so the same list is what the writer reads the
59
- sentence against: a comma followed by `not`, a `rather than`, a `not just`, a
60
- ranking of one thing over another.
61
-
62
- ## Sibling rules
63
-
64
- | Rule | Role |
65
- |---|---|
66
- | [`asd-ste100-language.md`](asd-ste100-language.md) | Plain word choice, sentence style, and tone |
67
- | [`correction-lens.md`](correction-lens.md) | Every correction becomes a control at the highest layer that can hold it |
68
- | [`research-mode.md`](research-mode.md) | A claim carries its source |
9
+ **Full text:** [`docs/rule-guides/no-contrast-framing.md`](../docs/rule-guides/no-contrast-framing.md). Read it for examples and checker exceptions.
@@ -1,29 +1,9 @@
1
- # Research Mode (Global)
1
+ # Research mode
2
2
 
3
- Three anti-hallucination constraints are always active.
3
+ **When:** Making a factual claim, recommendation, or piece of advice.
4
4
 
5
- Source: [Anthropic - Reduce Hallucinations](https://docs.anthropic.com/en/docs/test-and-evaluate/strengthen-guardrails/reduce-hallucinations)
5
+ Say when you lack a credible source; do not guess or infer. Cite a project file, web source, named expert or paper, or official documentation for each claim. Retract claims a source cannot support. Extract document text before analysis and ground the answer in word-for-word quotes. In chat, cite compactly with a link or `file:line`; put full quotes and citation lists in artifacts or replies that request them. Ground synthesis in sourced inputs. Creative ideas need no citation.
6
6
 
7
- ## 1. Say "I don't know"
8
- If you don't have a credible source for a claim, say so. Don't guess. Don't infer. "I don't have data on this" is always a valid answer.
7
+ **Enforcement:** none, the agent applies it.
9
8
 
10
- ## 2. Verify with citations
11
- Every recommendation, claim, or piece of advice must cite a specific source:
12
- - A file in the current project
13
- - An external source found via web search (with URL)
14
- - A named expert, paper, or researcher
15
- - Official documentation
16
-
17
- If you generate a claim and cannot find a supporting source, retract it. Do not present it.
18
-
19
- A citation is checked against what the source says, not against whether the source exists. A named authority attached to a claim the authority does not make is weaker than no citation at all, because it stops the reader from asking. This bites hardest on numbers: a threshold that runs stricter or looser than its source is a house call, so label it as one and leave the attribution to the direction the source does support.
20
-
21
- ## 3. Direct quotes for factual grounding
22
- When working from documents, extract the text first before analyzing. Ground your response in word-for-word quotes, not paraphrased summaries. Reference the quote when making your point.
23
-
24
- ## How citations appear in a chat reply
25
-
26
- The grounding requirement above never relaxes: state no claim you cannot source. What changes with the channel is how much of the source you print. A chat reply carries the source in compact form — a linked source name, or a `file:line` reference. Word-for-word quotes and full citation lists belong in artifacts, PR bodies, and issue bodies, or in a reply when the user asks for them.
27
-
28
- ## Exceptions
29
- Creative thinking, brainstorming, and novel ideas don't require citation. You can synthesize across sources to reach new conclusions, but the inputs must be grounded.
9
+ **Full text:** [`docs/rule-guides/research-mode.md`](../docs/rule-guides/research-mode.md). Read it when checking a source or citation.
@@ -1,52 +1,9 @@
1
- # Verify Before Asking
1
+ # Verify before asking
2
2
 
3
- **When this applies:** Before asking the user any clarifying question during discovery, scoping, or implementation planning.
3
+ **When:** Before asking the user a clarifying question.
4
4
 
5
- ## Rule
5
+ Inspect files, directories, configuration, environment, databases, and available tools for the answer. Recheck facts recalled from earlier sessions. Apply any criterion the user already supplied and state the decision. Ask only for a judgment, preference, or inaccessible fact; use the session's question tool when available.
6
6
 
7
- If a question can be answered by inspecting files, running a command, querying a database, reading a config, or using any available tool, answer it yourself. Only ask the user questions that require their judgment, preference, or knowledge that is not accessible to automated inspection.
7
+ **Enforcement:** none, the agent applies it.
8
8
 
9
- ## Decision Checklist
10
-
11
- Before using the current session's native question tool or asking a clarifying question in chat, evaluate:
12
-
13
- | Check | Action |
14
- |---|---|
15
- | Does the answer live in a file on disk? | Read the file. |
16
- | Does the answer live in a directory structure? | List the directory. |
17
- | Does the answer live in a database? | Query the database. |
18
- | Does the answer live in git history? | Run `git log` or `git blame`. |
19
- | Is the answer determined by file naming patterns or contents? | Glob a sample and inspect. |
20
- | Is the answer a value in a config or environment variable? | Read the config or check the env. |
21
- | Is the answer retrievable from any available MCP tool? | Use the tool. |
22
- | Did the user already state a criterion, standard, or line that decides this? | Apply it, state the call and the reason, and keep going. |
23
-
24
- Only after confirming the answer cannot be obtained through any available tool, ask the user. Present the question using [Present questions clearly](question-presentation.md).
25
-
26
- ## Prior-session facts expire
27
-
28
- A path, port, branch name, or config value you recall from an earlier session counts as unanswered until a tool re-checks it this session. Memory records what was true when it was written; the file may have moved, the port may be down, the branch may have merged. Treat every recalled fact as a claim to re-ground, not an answer to reuse.
29
-
30
- - When a tool can settle it, re-check in silence and act on the fresh result — no question to the user.
31
- - When no tool can settle it and the user has a stake in the answer, use the current session's native question tool when available.
32
-
33
- ## Questions That Belong to the User
34
-
35
- Reserve user questions for:
36
- - **Preferences** — "Do you want approach A or B?" when both are viable and the user has a stake.
37
- - **Missing context the user holds** — passwords, account names, intent, future plans.
38
- - **Judgment calls** — tradeoffs the user needs to evaluate.
39
- - **Scope decisions** — what to include or exclude from a piece of work.
40
-
41
- A preference question is one where the user has not yet given the line. Once they have, every case under that line is yours to decide. Handing back each application of a stated criterion turns one decision into many and stalls the work, because the person who set the standard does not hold the individual answers. Apply the criterion, name the call and the reason it went that way, and escalate only what the criterion cannot settle: a new axis it never covered, or a step nobody can undo. [`long-horizon-autonomy.md`](long-horizon-autonomy.md) carries the same duty for authority the task already granted.
42
-
43
- ## Examples
44
-
45
- **Wrong:** "Are there multiple images per folder, or just one image + one mp4?"
46
- **Right:** List the folder contents directly, then state what was found.
47
-
48
- **Wrong:** "What columns does the themes table have?"
49
- **Right:** Query `information_schema.columns` and report the schema.
50
-
51
- **Wrong:** "Is there a Prisma schema in this project?"
52
- **Right:** Glob for `schema.prisma` and check.
9
+ **Full text:** [`docs/rule-guides/verify-before-asking.md`](../docs/rule-guides/verify-before-asking.md). Read it when the source of an answer is uncertain.
@@ -1,42 +1,9 @@
1
- # Verify Runtime State
1
+ # Verify runtime state
2
2
 
3
- **When this applies:** Before stating that a component is fine, healthy, not at fault, or working — during debugging, triage, or any judgment about whether something runs.
3
+ **When:** Before saying a component works, is healthy, or is not the cause of a failure.
4
4
 
5
- ## Rule
5
+ Gather a live signal this session: process list, port probe, log, status code, or fresh reproduction. Read the user's terminal and named error log while a reported failure is still visible. Check the effect the work should produce, including each job result, loaded config, or deployed artifact; a success status alone does not establish the effect. When testing code, identify the loaded module path.
6
6
 
7
- A verdict that a component is fine or not the cause rests on live evidence gathered this session: a process list, a port probe, a log tail, an HTTP status code, or a fresh repro. Reading the code, recalling how the component behaved earlier, or trusting a prior session's finding does not settle whether it runs right now. Code shows what should happen; only a live probe shows what does.
7
+ **Enforcement:** none, the agent applies it.
8
8
 
9
- Gather the probe before you write the verdict. When the probe contradicts the code (the code looks right but the port refuses the connection), report the live result and treat the component as suspect.
10
-
11
- A status field is a report, not the effect. An exit code, a green pipeline run, and a task result all say the work finished. They do not say the work happened. Read the thing the work was meant to make.
12
-
13
- Some evidence lasts only a moment. When a user shows you a failure, read the source they already hold: the terminal itself, and any log file the error names. A fresh probe minutes later measures a different moment, and a system that healed in between hides the failure you were asked about.
14
-
15
- ## Grounding checklist
16
-
17
- Before stating a runtime claim, gather the matching live signal:
18
-
19
- | Claim | Grounding probe |
20
- |---|---|
21
- | The service is healthy | Hit its health endpoint and read the status code. |
22
- | The config is in effect | Print the loaded config at runtime and read the value. |
23
- | The server is up | Probe the port; a refused connection means it is down. |
24
- | The process is running | List processes and match the name or PID. |
25
- | The change took effect | Drive the flow and watch the new behavior. A script that proves a branch's behavior names the module file it loaded, as its first step, because an installed copy of the same package shadows the checkout you meant to test. |
26
- | The dependency is reachable | Send one request and read the response. |
27
- | The release or deploy shipped | Read what it makes: the tag, the published version, the file on disk. |
28
- | The pipeline did the work | Read each job's own result. A run reports success while a job inside it is skipped. |
29
- | The automation works | Drive the branch that matters. A green run of the do-nothing branch proves nothing. |
30
-
31
- Only after a live signal backs the claim do you state it.
32
-
33
- ## Examples
34
-
35
- **Wrong:** "The search server code looks correct, so it is not the problem."
36
- **Right:** Probe port 54321; report "connection refused — the server is down."
37
-
38
- **Wrong:** "This function handles the retry, so the request must be going through."
39
- **Right:** Tail the request log and confirm the retry fired, or report that no retry line appears.
40
-
41
- **Wrong:** "The config sets the timeout to 30 seconds, so the timeout is fine."
42
- **Right:** Print the loaded config at runtime and report the value the process holds.
9
+ **Full text:** [`docs/rule-guides/verify-runtime-state.md`](../docs/rule-guides/verify-runtime-state.md). Read it when choosing the probe for a claim.