Skip to main content

Command Palette

Search for a command to run...

How I Configured Claude Code as an Architect: 10 Settings, Grouped by What They Fix

Updated
6 min read
How I Configured Claude Code as an Architect: 10 Settings, Grouped by What They Fix
E
I’m working on AI-powered tools focused on automation and productivity. I’ve been testing different APIs and experimenting with use cases around AI agents and workflow optimization.

I build with Claude Code every day, and for the first few months I treated it like a finished tool. It was the wrong mental model. It's closer to a platform: the defaults run at "fine," and the configuration is where the real speed lives. Below are the ten settings that earned a permanent place in my setup, grouped by the problem each one solves rather than listed flat.

Every section ends with config you can copy.

Problem 1: The agent forgets things mid-session

This was the failure that wasted the most time, and the fix was counterintuitive.

Cap CLAUDE.md at 8,000 characters

By March my CLAUDE.md was 40,000 characters — every convention and decision I could think of. More context, better output, I assumed. The opposite happened. Transformers don't retain the middle of long documents well, and past a certain size the agent stopped attending to rules in the middle of the file. I asked it to reproduce a rule from line 300 of its own config. It couldn't.

Hard cap: 8,000 characters in the main file, the rest split out and loaded on demand.

.claude/
├── CLAUDE.md       # always-on, ≤ 8,000 chars: stack, prohibitions, links
├── skills/         # task-specific rules, loaded when relevant
└── specs/          # domain-model.md, api-contracts.md, infra.md

Result: main file at 6,000 chars, sharper answers, ~35% lower session-init token cost.

Lazy-load context with skills

Skills are markdown files in .claude/skills/, loaded only when relevant — so project-specific rules aren't sitting in the agent's memory full-time.

.claude/skills/
├── nestjs-conventions.md
├── clean-arch.md
├── typescript-strict.md
├── testing-strategy.md
└── code-review-checklist.md

Writing a NestJS module pulls nestjs-conventions; a refactor pulls clean-arch; a review pulls code-review-checklist. After moving to skills: 30–40% lower token use in standard sessions, and the agent stopped mixing rules across domains.

Restart before context rot wins

Long sessions degrade. The tells: the agent re-proposes a rejected idea, suggests editing code it just wrote, or asks you to "clarify the task" you gave 10 messages ago. Don't push through — restart with a short handoff.

# Context to continue
**Task:** [one sentence]
**Done:** [file/function]: [what]
**Ruled out (discussed):** [option]: [why]
**Next step:** [one concrete item]

My trigger: 3 messages with no forward progress → restart.

Problem 2: The agent does things I didn't ask for

Permissions that stop interrupting you (but still block damage)

{
  "permissions": {
    "allow": ["Bash(git diff:*)", "Bash(git status:*)", "Bash(npm test:*)", "Bash(npm run lint:*)"],
    "deny":  ["Bash(git push:*)", "Bash(git reset --hard:*)", "Bash(rm -rf:*)"]
  }
}

Read/test commands pass without prompts; writes and deletes still ask. Interruptions per session: 15–20 → 2–3. deny outranks allow. Commit .claude/settings.json and the team inherits it.

Split settings by environment

Team config stays strict and committed; personal config is local and gitignored.

// .claude/settings.json (team, committed)
{ "permissions": { "deny": ["Bash(kubectl delete:*)", "Bash(terraform destroy:*)", "Bash(rm -rf:*)"] } }
// .claude/settings.local.json (personal, gitignored)
{ "permissions": { "allow": ["Bash(docker compose up --build:*)", "Bash(npm run db:reset:*)"] } }

You move fast locally; the production-dangerous denies hold because deny always beats allow.

acceptEdits, but only with a safety net

acceptEdits is great for type migrations, renames, formatting, and test generation. It's a trap for new features, architectural refactors, and auth/payment/data-layer work. I once enabled it for "clean up unused imports" and the agent rewrote a few services while it was in the file — 30 unplanned minutes of review. Rule: acceptEdits only when automated tests can catch the mistake.

Hooks as guardrails

A PreToolUse hook blocks dangerous commands by returning exit 2 (stderr goes back to the agent):

#!/bin/bash
# ~/.claude/hooks/pre_tool.sh
INPUT=$(cat)
COMMAND=\((echo "\)INPUT" | jq -r '.tool_input.command // empty')
DANGEROUS="(rm -rf|DROP TABLE|truncate|DELETE FROM.*WHERE 1=1|git reset --hard|kubectl delete)"
if echo "\(COMMAND" | grep -qiE "\)DANGEROUS"; then
  echo "BLOCKED: dangerous command: $COMMAND" >&2; exit 2
fi
exit 0

A Stop hook logs every session so you know how much you actually use the tool (mine: ~2h15m/day, not the "occasionally" I'd assumed). Wire them in settings.json under hooks.Stop / hooks.PreToolUse. A notification hook (osascript/notify-send) frees you to context-switch while the agent works.

Problem 3: Knowing how hard to push, and when to stop

Effort levels

A custom skill with four depths. (/effort is mine, not built in; built-in depth control is think / ultrathink.)

/effort low     fast draft, no plan         → throwaway
/effort medium  short plan, implement       → standard work
/effort high    detailed plan, implement    → new components, public API
/effort max     analyze→plan→approval→implement→report, stop for OK each step → core/auth/schema

Zero full rollbacks on /effort max in six months. If max feels like overkill for a task, the task's easier than you thought.

The two-correction rule

Correct the agent twice on the same point in one session → stop. Two failures means the framing is wrong, not the agent. Rebuild it: split smaller, give a concrete example of the desired output, or write the skeleton and let it fill in. Estimated 15–20 hours saved over six months.

Multi-model council for irreversible decisions

For module layout, schemas, and contracts, I run the same task across models:

Opus:   "Design [X]. Priority: reliability, explicit contracts"
Sonnet: "Design [X]. Priority: development speed"
Haiku:  "Design [X]. Minimal complexity, minimal abstraction"

A fourth Opus session synthesizes against our context. ~25 minutes; on my last big refactor it replaced a week of team debate.

The operational question that follows

Running models in parallel surfaces a question Claude Code doesn't answer: which workflow uses which model, and what does each cost? That's routing and cost attribution, and it lives outside the CLI. Routing Claude Code through a gateway gives per-workflow, per-model cost visibility across providers — the EvoLink Claude Code CLI guide covers the setup.

Wrap-up

Grouped or flat, the through-line is the same: Claude Code's defaults are a floor. Budget your context, set guardrails, and learn when to throw a session away, and the tool moves from "fine" to "fast." My rough tally: 50–60 hours recovered in six months. All figures are my own from daily use, not benchmarks.


Claude Code docs


tags: claude-code, ai, developer-tools, productivity