Claude Code is already a capable coding agent, but model capability alone does not guarantee consistent software-engineering behavior.
In real projects, common failures include:
- Editing before fully understanding the requirement
- Treating a plausible hypothesis as a verified root cause
- Assuming an implementation exists, therefore the feature works
- Stopping after compilation without verifying actual behavior
- Performing unnecessarily expensive investigation
- Expanding the scope beyond the requested change
- Stopping too early when useful autonomous verification remains
A practical way to reduce these problems is to combine:
Global Engineering Rules ↓Guide Claude while it worksStop Hook ↓Review whether the current turn is actually ready to end
This does not change the underlying model.
It improves the engineering process around the model.
1. Back Up Existing Configuration
mkdir -p ~/.claude/rulescp ~/.claude/settings.json \ ~/.claude/settings.json.backup 2>/dev/null || truecp ~/.claude/rules/engineering.md \ ~/.claude/rules/engineering.md.backup 2>/dev/null || true
2. Create Global Engineering Rules
Create:
~/.claude/rules/engineering.md
Run:
cat > ~/.claude/rules/engineering.md <<'MD'# Global Engineering Discipline## 1. Understand intent before editingBefore changing code:- Understand the developer's actual objective.- Separate the desired outcome from the suggested implementation.- Identify constraints and existing behavior that must be preserved.- Inspect enough surrounding architecture before editing.- Do not patch the first function that appears related.For non-trivial tasks, inspect as applicable:- relevant modules;- definitions and callers;- registrations and entry points;- lifecycle/state ownership;- schemas/contracts;- configuration;- tests;- relevant project documentation.## 2. Verify full integration and reachabilityImplementation existence does not prove that a feature works.Trace the relevant path as applicable:implementation→ declaration→ registration→ entry point→ callback→ state transition→ consumer→ output→ actual runtime reachabilityLook for:- disconnected entry points;- missing registrations;- stale configuration;- orphaned functions;- broken callbacks;- alternate execution paths.## 3. Avoid premature closureDo not stop at the first plausible explanation.Before concluding:- try to falsify the current hypothesis;- search for contradictory evidence;- inspect adjacent paths;- check alternate states or modes where relevant.If new evidence contradicts the current hypothesis, update the hypothesis.Do not defend an earlier explanation after the evidence changes.## 4. Match conclusion strength to evidence strengthDistinguish clearly between:- observed fact;- static inference;- runtime evidence;- hypothesis;- probable explanation;- verified root cause.Do not present a hypothesis as a verified root cause.Prefer:direct runtime evidence> invariant-based reasoning> complete static integration analysis> partial static evidence> intuitionAvoid claims such as:- "everything is working";- "nothing else is missing";- "no regressions";- "this is the only issue";unless the relevant scope was explicitly defined and verified.## 5. Preserve working behaviorBefore editing:- identify what currently works;- identify what must remain unchanged;- avoid unrelated cleanup;- avoid unnecessary broad rewrites;- do not delete apparently unused code before checking reachability and history.Prefer the smallest safe architectural change.## 6. Root cause before patchFor bugs:- identify the violated invariant;- identify the failing state transition;- locate the earliest point where actual state differs from expected state;- distinguish root cause from visible symptoms.For stateful systems, consider:source→ derived state→ internal state→ synchronization/update→ consumer→ output## 7. Instrument reproducible bugsFor reproducible bugs, prefer direct evidence over repeated speculation.Useful instrumentation targets include:- input values;- derived values;- internal state;- update flags;- lifecycle state;- callback invocation;- timestamps or execution order.After TWO materially contradicted hypotheses:STOP speculative branching and instrument the relevant state.## 8. Avoid magic heuristicsBefore adding an arbitrary:- threshold;- percentage;- tolerance;- timeout;- ratio;ask:"What is the actual failure condition?"If the real condition can be measured directly, measure it directly.Use heuristics only when direct detection is impractical.For non-trivial design choices, compare at least two approaches against:- correctness;- minimal diff;- coupling;- maintainability;- reuse;- regression risk.Root cause found does not automatically mean the first patch idea is the best solution.## 9. Verify after editingCompilation alone is not sufficient.After editing:- inspect the final diff;- verify only intended files changed;- run relevant tests;- verify actual behavior;- check important alternate execution paths;- confirm that existing behavior was preserved.Ask:"What could still be wrong even though this builds?"Then verify the highest-risk possibilities.## 10. Progressive inspection for large inputsFor large datasets, many files, repositories, logs, or expensive I/O,use progressive inspection.Before reading large amounts of information, ask:- What decision am I trying to make?- What is the minimum evidence required?- Can metadata, headers, boundaries, indexes, or samples answer it?- Is a complete scan actually necessary now?### Level 1 — reconnaissancePrefer lightweight evidence:- file count;- file size;- naming patterns;- metadata;- schema;- headers;- first records;- last records;- boundary information;- existing indexes or summaries.Do not perform a full scan merely to understand the general structure.### Level 2 — targeted inspectionIf Level 1 reveals anomalies:- inspect only suspicious files;- inspect only relevant ranges;- inspect only relevant fields;- stream data where possible.### Level 3 — exhaustive validationPerform a complete scan only when:- the user explicitly requires exhaustive validation;- correctness depends on it;- targeted inspection shows that it is necessary;- the current decision cannot reliably be made otherwise.Separate planning from validation.During planning-only tasks, do not automatically perform expensive exhaustive validation.Prefer the cheapest evidence sufficient for the current decision.More work is not automatically more rigorous.## 11. Working prioritiesOptimize in this order:1. Correct understanding of developer intent2. Correctness3. Preservation of existing behavior4. Evidence-backed reasoning5. Architectural fit6. Minimal safe change7. Verification8. Maintainability9. SpeedMD
3. Add a Stop Review Hook
The Stop Hook reviews whether Claude should end the current assistant turn.
The important distinction is:
ending the current turn
is not the same as:
finishing the entire project
If Claude genuinely needs a user decision, approval, or additional information, returning control to the user is correct.
Run:
python3 - <<'PY'import jsonfrom pathlib import Pathp = Path.home() / ".claude/settings.json"if p.exists(): data = json.loads(p.read_text())else: data = {}prompt = r"""You are reviewing whether Claude may end the CURRENT TURN.IMPORTANT:Stopping means ending the current assistant turn and returning control to the user.It does NOT mean the entire project must already be finished.ALLOW STOPPING with {"ok": true} when:1. Claude completed the requested work for this turn.2. Claude produced the requested investigation or plan.3. Claude is correctly waiting for a necessary user decision or answer.4. Further progress requires user approval, credentials, domain judgment, or input.5. Claude reached a reasonable checkpoint requested by the user.NEVER block stopping merely because the overall project still has future work.NEVER force Claude to repeatedly say that it is waiting for the user.Waiting for necessary user input is a valid reason to end the current turn.Only return {"ok": false, "reason": "..."} when Claude could and should continueworking autonomously in THIS TURN.When evaluating a potentially premature stop, check:- Was the user's actual request satisfied?- Did Claude stop before performing investigation it could still perform?- Was a root cause claimed without sufficient evidence?- Was completeness claimed without verifying the relevant scope?- Was a reproducible bug investigated using evidence or instrumentation?- Was an arbitrary heuristic introduced when direct detection was possible?- Was behavior verified after editing?- Was an expensive exhaustive investigation performed when lightweight inspection was sufficient?Do not demand unnecessary extra work.Return JSON only:{"ok": true}or{"ok": false, "reason": "specific work Claude should continue doing now"}Context:$ARGUMENTS"""hooks = data.setdefault("hooks", {})stop = hooks.setdefault("Stop", [])if not stop: stop.append({"hooks": []})found = Falsefor group in stop: for hook in group.get("hooks", []): if hook.get("type") == "prompt": hook["prompt"] = prompt hook["timeout"] = 30 hook.pop("model", None) found = Trueif not found: stop[0].setdefault("hooks", []).append({ "type": "prompt", "timeout": 30, "prompt": prompt })p.parent.mkdir(parents=True, exist_ok=True)p.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n")print("Updated:", p)PY
4. Validate the Configuration
python3 -m json.tool ~/.claude/settings.json
If there is no JSON error, restart Claude Code.
Then run:
/hooks
Open the Stop event.
A prompt hook loaded from user settings should be visible.
5. Test the Configuration
Example:
First investigate and create a plan.Do not modify anything yet.If a decision is required from me, ask before continuing.
Expected behavior:
investigation→ plan→ necessary question→ Stop Hook→ control returns to the user
If useful autonomous investigation is still possible, the Stop Hook can instead request that Claude continue.
6. Test Progressive Inspection
Example:
This directory contains many large files.Do not modify anything.I only need an initial processing plan.Use lightweight inspection first and perform deeper inspection only when necessary.
A good approach should resemble:
file listing→ metadata→ boundaries/samples→ targeted inspection→ full validation only if justified
rather than immediately scanning everything.
7. Roll Back
If backups exist:
cp ~/.claude/settings.json.backup \ ~/.claude/settings.jsoncp ~/.claude/rules/engineering.md.backup \ ~/.claude/rules/engineering.md
Why This Helps
The goal is not simply to make Claude think longer.
The goal is to make its engineering process more consistent:
Claude Code+Engineering Rules+Stop Review=More Reliable Agent Behavior
The highest-value principles are:
- Understand the real requirement before editing
- Prefer evidence over plausible stories
- Trace actual integration paths
- Instrument reproducible problems instead of repeatedly guessing
- Avoid arbitrary heuristics when direct detection is possible
- Use the cheapest sufficient evidence
- Verify behavior, not only compilation
The result is usually a higher reliability floor rather than a different underlying model.