mirror of
https://github.com/wassname/.tweakcc.git
synced 2026-06-27 16:58:37 +08:00
82 lines
4.8 KiB
Markdown
82 lines
4.8 KiB
Markdown
# tweakcc-minimal
|
|
|
|
Minimal system prompts for Claude Code. Edits live in `system-prompts/*.md`.
|
|
|
|
## Design principles
|
|
|
|
Sources: [Pi system prompt](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/system-prompt.ts), [Pi blog post](https://mariozechner.at/posts/2025-11-30-pi-coding-agent/), [Armin on Pi](https://lucumr.pocoo.org/2026/1/31/pi/), [Trail of Bits config](https://github.com/trailofbits/claude-code-config), [arch](https://www.southbridge.ai/blog/claude-code-an-analysis)
|
|
|
|
1. **Trust the model** -- frontier models know how to code; provide context and tools, not tutorials. Pi's entire prompt is ~1k tokens.
|
|
2. **Delegate workflow** -- CLAUDE.md/AGENTS.md own conventions, not the system prompt
|
|
3. **Disposability** -- cut anything that doesn't earn its context-window cost
|
|
4. **Sandbox over guardrails** -- real security = OS-level sandbox (bubblewrap/seatbelt via `/sandbox`) + deny rules + devcontainers, not verbose prompt text. Trail of Bits pairs `--dangerously-skip-permissions` with layered defense: sandbox + deny rules + ephemeral containers.
|
|
5. **Hooks over prompts** -- "NEVER use rm -rf" in a prompt can be forgotten; a PreToolUse hook fires every time.
|
|
6. **Cheapest effective layer** -- enforce at: OS sandbox > deny rules > hooks > prompt text (last resort)
|
|
|
|
## Review methodology: 6 dimensions
|
|
|
|
| # | Dimension | Question | If yes |
|
|
|---|-----------|----------|--------|
|
|
| 1 | Model-knows-this | Would the model do this without being told? | Remove |
|
|
| 2 | CLAUDE.md overlap | Is the user's CLAUDE.md already saying this? | Remove from system prompt |
|
|
| 3 | Safety-critical | Would removing this cause dangerous behavior? | Keep, compress |
|
|
| 4 | Tool-binding | Necessary for the tool to function? | Keep |
|
|
| 5 | Behavioral shaping | Meaningfully changes default behavior? | Keep if proven |
|
|
| 6 | Context cost | How many chars? Always-loaded? | Prioritize cuts in always-loaded |
|
|
|
|
Heuristic: if removing a line would cause a failure mode you've actually seen, keep it. If it's "just in case", cut it.
|
|
|
|
## What gets loaded when (CC 2.1.63)
|
|
|
|
Source: Southbridge Research reconstructed code (inferred, not decompiled). No `loadType` field exists in prompts JSON -- loading category is inferred from ID prefix.
|
|
|
|
**Always loaded:**
|
|
- `system-prompt-*` -- every turn (~10 are feature-gated by CC settings, e.g. chrome, learning-mode, hooks-config)
|
|
- `tool-description-*` -- always present as part of the tool schema; no event gate exists. Example: `tool-description-bash-git-commit-*` burns ~1KB per turn even when just searching files
|
|
- Monolithic + sub-files both loaded by tweakcc; empty monolithic ones to avoid duplication
|
|
|
|
**Event-driven (injected per-turn on condition):**
|
|
- `system-reminder-plan-mode-*` -- when plan mode active
|
|
- `system-reminder-team-*` -- when team/swarm mode active
|
|
- `system-reminder-todo-*`, task nudges -- periodic / on task events
|
|
- File events, hook outcomes, token/budget warnings -- per-turn
|
|
|
|
**On-demand (loaded at spawn/invocation):**
|
|
- `agent-prompt-*` -- loaded when that agent type spawned
|
|
- `data-*`, `skill-*` -- referenced on demand per user/model request
|
|
|
|
**Within-file conditionals**: `${VAR?trueText:""}` in `pieces[]` are render-time substitutions -- the file is always loaded, only the text fragment varies. NOT file-level load gates.
|
|
|
|
**Compaction**: triggers at 100k tokens OR 200 messages OR $5 cost. Skipped if <50 messages. Summarizes non-preserved messages via LLM call.
|
|
|
|
**Context budget:**
|
|
|
|
| Category | Stock words | tweakcc words | Reduction | Loading |
|
|
|----------|-------------|---------------|-----------|---------|
|
|
| System Prompts | ~4.5k | ~3.7k | -18% | Always |
|
|
| Tool Descriptions | ~6.3k | ~3.8k | -40% | Always |
|
|
| System Reminders | ~1.7k | ~1.7k | -- | Event-driven |
|
|
| Agent Prompts | ~6.9k | ~6.9k | -- | On-demand (spawn) |
|
|
|
|
Total always-loaded: ~7.5k words (down from ~10.8k stock).
|
|
On-demand (untouched): Data ~154k chars, Skills ~45k chars, Agent Prompts ~69k chars.
|
|
|
|
**Frontmatter is upstream-controlled**: `tweakcc --apply` restores YAML headers (name, description, ccVersion, variables) from CC. We only control the body content.
|
|
|
|
## How to edit
|
|
|
|
1. Edit `.md` files in `system-prompts/`
|
|
2. Re-apply: `npx tweakcc --apply`
|
|
3. Files use YAML frontmatter in HTML comments + `${VARIABLE}` template interpolation
|
|
4. Backticks in body must be escaped as `\`` (tweakcc parser requirement)
|
|
5. Don't delete files; empty the content to disable (tweakcc expects files to exist)
|
|
6. Header-only files (just `<!-- -->`) effectively disable that prompt piece
|
|
|
|
## File naming conventions
|
|
|
|
- `system-prompt-*` -- core behavioral, always loaded
|
|
- `system-reminder-*` -- event-driven (plan mode, task nudges, file events, hooks)
|
|
- `tool-description-*` -- loaded with tool schemas
|
|
- `agent-prompt-*` -- loaded when agent type spawned
|
|
- `data-*` -- reference data, on-demand
|
|
- `skill-*` -- skill definitions, on-demand |