chisle 3.5.0 → 3.6.0
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.
- package/.claude-plugin/plugin.json +1 -1
- package/.clinerules/chisle.md +2 -1
- package/.cursor/rules/chisle.mdc +2 -1
- package/.github/copilot-instructions.md +2 -1
- package/.kiro/steering/chisle.md +2 -1
- package/.windsurf/rules/chisle.md +2 -1
- package/AGENTS.md +5 -0
- package/README.md +50 -16
- package/hooks/chisle-activate.js +1 -1
- package/hooks/chisle-config.js +0 -1
- package/package.json +1 -1
- package/skills/chisle/SKILL.md +32 -99
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chisle",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0",
|
|
4
4
|
"description": "Maximum-efficiency dev mode. Zero-fluff prose combined with YAGNI/ladder-first code decisions. One persona: the senior dev who deletes code for fun and bills by the syllable.",
|
|
5
5
|
"hooks": {
|
|
6
6
|
"SessionStart": [
|
package/.clinerules/chisle.md
CHANGED
|
@@ -8,7 +8,8 @@ meaning survives. Causality as arrows (X → Y). Technical terms, code, API name
|
|
|
8
8
|
errors: exact, verbatim. Terse ≠ incomplete: keep every decisive fact (the fix,
|
|
9
9
|
the gotcha, the why); cut the words around them, never the facts. Structure is
|
|
10
10
|
tokens, so answer at the question's altitude; no manufactured headings, bullet
|
|
11
|
-
lists, or sections the question didn't ask for.
|
|
11
|
+
lists, numbered steps, or sections the question didn't ask for. Two tight
|
|
12
|
+
paragraphs beat five headed sections. "Summarize/compare X vs Y" is
|
|
12
13
|
the trap: skip headed pro/con bullet walls, name the decisive tradeoffs in
|
|
13
14
|
prose, give the verdict, stop.
|
|
14
15
|
|
package/.cursor/rules/chisle.mdc
CHANGED
|
@@ -13,7 +13,8 @@ meaning survives. Causality as arrows (X → Y). Technical terms, code, API name
|
|
|
13
13
|
errors: exact, verbatim. Terse ≠ incomplete: keep every decisive fact (the fix,
|
|
14
14
|
the gotcha, the why); cut the words around them, never the facts. Structure is
|
|
15
15
|
tokens, so answer at the question's altitude; no manufactured headings, bullet
|
|
16
|
-
lists, or sections the question didn't ask for.
|
|
16
|
+
lists, numbered steps, or sections the question didn't ask for. Two tight
|
|
17
|
+
paragraphs beat five headed sections. "Summarize/compare X vs Y" is
|
|
17
18
|
the trap: skip headed pro/con bullet walls, name the decisive tradeoffs in
|
|
18
19
|
prose, give the verdict, stop.
|
|
19
20
|
|
|
@@ -8,7 +8,8 @@ meaning survives. Causality as arrows (X → Y). Technical terms, code, API name
|
|
|
8
8
|
errors: exact, verbatim. Terse ≠ incomplete: keep every decisive fact (the fix,
|
|
9
9
|
the gotcha, the why); cut the words around them, never the facts. Structure is
|
|
10
10
|
tokens, so answer at the question's altitude; no manufactured headings, bullet
|
|
11
|
-
lists, or sections the question didn't ask for.
|
|
11
|
+
lists, numbered steps, or sections the question didn't ask for. Two tight
|
|
12
|
+
paragraphs beat five headed sections. "Summarize/compare X vs Y" is
|
|
12
13
|
the trap: skip headed pro/con bullet walls, name the decisive tradeoffs in
|
|
13
14
|
prose, give the verdict, stop.
|
|
14
15
|
|
package/.kiro/steering/chisle.md
CHANGED
|
@@ -12,7 +12,8 @@ meaning survives. Causality as arrows (X → Y). Technical terms, code, API name
|
|
|
12
12
|
errors: exact, verbatim. Terse ≠ incomplete: keep every decisive fact (the fix,
|
|
13
13
|
the gotcha, the why); cut the words around them, never the facts. Structure is
|
|
14
14
|
tokens, so answer at the question's altitude; no manufactured headings, bullet
|
|
15
|
-
lists, or sections the question didn't ask for.
|
|
15
|
+
lists, numbered steps, or sections the question didn't ask for. Two tight
|
|
16
|
+
paragraphs beat five headed sections. "Summarize/compare X vs Y" is
|
|
16
17
|
the trap: skip headed pro/con bullet walls, name the decisive tradeoffs in
|
|
17
18
|
prose, give the verdict, stop.
|
|
18
19
|
|
|
@@ -12,7 +12,8 @@ meaning survives. Causality as arrows (X → Y). Technical terms, code, API name
|
|
|
12
12
|
errors: exact, verbatim. Terse ≠ incomplete: keep every decisive fact (the fix,
|
|
13
13
|
the gotcha, the why); cut the words around them, never the facts. Structure is
|
|
14
14
|
tokens, so answer at the question's altitude; no manufactured headings, bullet
|
|
15
|
-
lists, or sections the question didn't ask for.
|
|
15
|
+
lists, numbered steps, or sections the question didn't ask for. Two tight
|
|
16
|
+
paragraphs beat five headed sections. "Summarize/compare X vs Y" is
|
|
16
17
|
the trap: skip headed pro/con bullet walls, name the decisive tradeoffs in
|
|
17
18
|
prose, give the verdict, stop.
|
|
18
19
|
|
package/AGENTS.md
CHANGED
|
@@ -13,6 +13,11 @@ Drop articles, filler (just/really/basically/actually), pleasantries
|
|
|
13
13
|
(sure/certainly/happy to), hedging. Fragments OK. Technical terms exact.
|
|
14
14
|
Code blocks unchanged. Pattern: `[thing] [action] [reason].`
|
|
15
15
|
|
|
16
|
+
Terse ≠ incomplete: keep every decisive fact (the fix, the gotcha, the why);
|
|
17
|
+
cut the words around them. Structure is tokens: no headings, bullets,
|
|
18
|
+
numbered steps or tables the question didn't ask for. Two tight paragraphs
|
|
19
|
+
beat five headed sections.
|
|
20
|
+
|
|
16
21
|
## Code: the efficiency ladder
|
|
17
22
|
|
|
18
23
|
Before writing anything, stop at the first rung that holds:
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<em>The only tool in this class that publishes the runs where it lost.</em>
|
|
12
|
+
<em>The only tool in this class that publishes the runs where it lost. <a href="https://jaypokale.me/writing/chisle-benchmarks-it-loses">Here's why.</a></em>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
15
|
<p align="center">
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</p>
|
|
23
23
|
|
|
24
24
|
<p align="center">
|
|
25
|
-
<strong>
|
|
25
|
+
<strong>83% of a bare model's output, where caveman and ponytail land above 100% · 11 agents · zero dependencies · one command</strong>
|
|
26
26
|
</p>
|
|
27
27
|
|
|
28
28
|
<p align="center">
|
|
@@ -153,15 +153,25 @@ That refreshes every agent that already has Chisle and installs it into none tha
|
|
|
153
153
|
- **Plain `npx chisle` does not upgrade.** Every install path skips what is already present, so an upgrade run reports success and changes nothing. `--update` pairs the refresh with that check.
|
|
154
154
|
- **`@latest` matters.** `npx chisle` can serve a cached copy of the package from a previous run, so the pin is what guarantees you get the new one.
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
Update one agent at a time with `--only`:
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
|
-
|
|
160
|
-
pi install npm:chisle
|
|
161
|
-
gemini extensions install https://github.com/JayPokale/Chisle
|
|
159
|
+
npx chisle@latest --update --only claude # or: claude plugin update chisle@chisle
|
|
160
|
+
npx chisle@latest --update --only pi # or: pi install npm:chisle
|
|
161
|
+
npx chisle@latest --update --only gemini # or: gemini extensions install https://github.com/JayPokale/Chisle
|
|
162
|
+
npx chisle@latest --update --only codex
|
|
163
|
+
npx chisle@latest --update --only opencode # ruleset + skills + the compression plugin
|
|
164
|
+
npx chisle@latest --update --only hermes
|
|
162
165
|
```
|
|
163
166
|
|
|
164
|
-
|
|
167
|
+
Cursor, Windsurf, Cline, Kiro and Copilot keep their rule file **inside the repo**, because that is how those agents load rules:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
cd ~/code/my-project
|
|
171
|
+
npx chisle@latest --update --only cursor
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`--update` looks for that file in the current directory, so running it from `~` reports "Nothing to update" even when the project is set up correctly. Run it once per repo that has one. Full table, including what each agent's update actually refreshes: [INSTALL.md](./INSTALL.md#per-agent).
|
|
165
175
|
|
|
166
176
|
Not sure what you are running? `npx chisle --list` prints the agents it detects, and `claude plugin list` shows the installed plugin and its version.
|
|
167
177
|
|
|
@@ -224,7 +234,21 @@ node benchmarks/replay-compress.js pi # Pi; marginal over Pi's native truncat
|
|
|
224
234
|
|
|
225
235
|
Nothing here is estimated. Every figure below is recomputed from committed raw data; the 2026-07-07 [verification writeup](benchmarks/results/2026-07-07-verify-rerun.md) re-derived the old claims from scratch, re-ran the whole suite against the competitors' **installed plugins**, and retired the one claim that didn't survive.
|
|
226
236
|
|
|
227
|
-
### Output axis
|
|
237
|
+
### Output axis, re-measured 2026-10-01 (current)
|
|
238
|
+
|
|
239
|
+
Re-run with the shipped ruleset, Claude Code 2.1.285 and the rivals' current plugins (caveman `ef6050c5e184`, ponytail 4.8.3): 13 live prompts × 2 seeds = 26 cells per arm on Haiku 4.5, billed output tokens vs the no-tool baseline ([writeup + raw cells](benchmarks/results/2026-10-01-live-rerun.md)):
|
|
240
|
+
|
|
241
|
+
| | total bill | 95% CI | visible answer | worst cell | backfires |
|
|
242
|
+
|---|--:|--:|--:|--:|--:|
|
|
243
|
+
| caveman | 102% | 79–128% | 105% | 305% | 15 / 26 |
|
|
244
|
+
| ponytail | 105% | 86–129% | 97% | 493% | 16 / 26 |
|
|
245
|
+
| **Chisle** | **83%** | **69–95%** | **76%** | **170%** | **11 / 26** |
|
|
246
|
+
|
|
247
|
+
Chisle is the only arm measurably below a bare model, by about a third of what the June table below claimed. It pays on long answers (77%) and coding prompts (76%); on short answers it breaks even (106%), on explanation prompts ponytail is leaner (86% vs 91%), and reasoning tokens are not cut (107%). Single cells swing hard between seeds (57% → 135% on one prompt), and the bare model "backfires" against itself on 13 of 26 cells, so read totals, not backfire counts ([control](benchmarks/results/2026-10-01-backfires.md)).
|
|
248
|
+
|
|
249
|
+
**Why the June headline was retired.** Its 52% leaned on one cell: the June bare `cache` answer billed 4,910 tokens, while every later run of the same prompt billed 375–813. The ruleset also carried examples matching `cache` (from June 18) and `auth-bug` (from June 27), so four cells may have been primed; without them the June total was 70%. The tables below stay as what they were.
|
|
250
|
+
|
|
251
|
+
### Output axis, June–July 2026 (superseded): vs caveman & ponytail, 20 live tasks
|
|
228
252
|
|
|
229
253
|
**What this suite measures, and what it does not.** Every figure below is *billed output tokens on single-turn prompts with no tools available*. That isolates the ruleset's effect on how the model writes, which is what it was built to measure. It is not whole-session cost: a real agentic session is dominated by tool output and cached input, so a tool can win here and still fail to pay for itself end to end. The input axis below is measured separately, and against its own baseline.
|
|
230
254
|
|
|
@@ -316,10 +340,10 @@ SUITE=large bash benchmarks/run-live.sh <model> benchmarks/results/raw-large
|
|
|
316
340
|
|
|
317
341
|
| | prose | code judgment | input/context | worst-case guard | publishes failures |
|
|
318
342
|
|---|:---:|:---:|:---:|:---:|:---:|
|
|
319
|
-
| caveman | ✅ | ❌ | ❌ | ❌
|
|
320
|
-
| ponytail | ❌ | ✅ | ❌ | ❌
|
|
343
|
+
| caveman | ✅ | ❌ | ❌ | ❌ 305% | ❌ |
|
|
344
|
+
| ponytail | ❌ | ✅ | ❌ | ❌ 493% | ❌ |
|
|
321
345
|
| headroom | ❌ | ❌ | ✅ proxy | n/a | ❌ |
|
|
322
|
-
| **Chisle** | ✅ | ✅ | ✅ hook | **
|
|
346
|
+
| **Chisle** | ✅ | ✅ | ✅ hook | **170%** | ✅ |
|
|
323
347
|
|
|
324
348
|
The row that matters is the last one. Every tool here looks good on its best day; the numbers above are the only ones in this class published alongside the run that went wrong. [Full comparison →](docs/comparison.md)
|
|
325
349
|
|
|
@@ -333,7 +357,7 @@ Measured over 171 real sessions ([receipts](benchmarks/results/2026-07-07-input-
|
|
|
333
357
|
| **elide** | oversized output → head + tail, error-like lines salvaged from the cut | bounded, guarded |
|
|
334
358
|
| **dedup** | byte-identical repeat of a tool's previous output (same session) → one-line marker | none, the copy is already in context |
|
|
335
359
|
|
|
336
|
-
Replayed over the same 171 Claude Code sessions: **~61k tokens** saved one-shot, ~46% off every eligible output: a floor, not an estimate, since each saved byte also stops being re-sent on every later request. Correctness rules: allowlist only (`Bash`, `Agent`, `WebFetch`, `WebSearch`, `Grep`, `Glob`, `mcp__*`), never `Read`/`Edit`, whose exact bytes feed later edits. Honest ledger: dedup scored **0 hits** on this corpus (rtk-filtered at source); it's kept for the test-rerun case, kill-switchable, and labeled speculative until it earns a number.
|
|
360
|
+
Replayed over the same 171 Claude Code sessions: **~61k tokens** saved one-shot, ~46% off every eligible output: a floor, not an estimate, since each saved byte also stops being re-sent on every later request. Correctness rules: allowlist only (`Bash`, `Agent`, `WebFetch`, `WebSearch`, `Grep`, `Glob`, `mcp__*`), never `Read`/`Edit`, whose exact bytes feed later edits. Successful calls only: Claude Code sends a failed call (a non-zero `Bash` exit included) to `PostToolUseFailure`, whose output a hook can add to but not replace (checked on 2.1.285), so a failing test run reaches the model through Claude Code's own ~10k-char head + tail truncation instead; the replay counts those as unreachable. Honest ledger: dedup scored **0 hits** on this corpus (rtk-filtered at source); it's kept for the test-rerun case, kill-switchable, and labeled speculative until it earns a number.
|
|
337
361
|
|
|
338
362
|
Pi already truncates built-in output at 50KB/2,000 lines. Replay over 8,044 persisted Pi results measured the compressor's **marginal** saving after that truncation: **27.4% of tool-output chars** ([receipt + raw live Pi arm](benchmarks/results/2026-09-11-pi.md)). Pi compresses `bash`, `powershell`, `grep`, `find`, `ls`, MCP, and explicitly allowlisted extension-tool results; `read`/`edit`/`write` remain untouched. `CHISLE_COMPRESS_TOOLS` supplies the same explicit override for runtime and replay. Runtime dedup only compares earlier turns, so concurrently completed sibling calls cannot dedup one another.
|
|
339
363
|
|
|
@@ -460,8 +484,8 @@ govern prose, so only the prose section yields.
|
|
|
460
484
|
|
|
461
485
|
Detection reads the `outputStyle` key across Claude Code's own settings precedence
|
|
462
486
|
(`.claude/settings.local.json`, where `/output-style` writes, then `.claude/settings.json`, then
|
|
463
|
-
`~/.claude/settings.json`). Claude Code
|
|
464
|
-
changes
|
|
487
|
+
`~/.claude/settings.json`). Claude Code only — Pi and OpenCode have no output-style mechanism, so
|
|
488
|
+
there is nothing to detect and nothing changes for them.
|
|
465
489
|
|
|
466
490
|
**Suppress a rule group manually.** The same `sections` key gives explicit control, and it always
|
|
467
491
|
beats detection — set `prose: true` to keep Chisle's prose rules even with a style active:
|
|
@@ -501,12 +525,12 @@ Chisle borrows the best published token-saving techniques and implements the one
|
|
|
501
525
|
|
|
502
526
|
## Multi-agent
|
|
503
527
|
|
|
504
|
-
Ships to eleven agents: Claude Code and Pi get both axes, live `/chisle` toggling, and a status badge; Cursor, Windsurf, Cline, Kiro, Codex, Gemini, and Copilot get the always-on ruleset;
|
|
528
|
+
Ships to eleven agents: Claude Code and Pi get both axes, live `/chisle` toggling, and a status badge; OpenCode gets both axes too — the global fenced ruleset, on-demand skills, and a native compression plugin — but no live toggle; Cursor, Windsurf, Cline, Kiro, Codex, Gemini, and Copilot get the always-on ruleset; Hermes gets the skills as `/chisle` commands. Per-agent static copies come from `scripts/build-rules.js`; Pi uses its package extension plus the Agent Skills standard. See [`docs/agent-portability.md`](./docs/agent-portability.md).
|
|
505
529
|
|
|
506
530
|
## FAQ
|
|
507
531
|
|
|
508
532
|
**Doesn't injecting a persona every turn cost tokens?**
|
|
509
|
-
Claude Code uses a ruleset at session start (~
|
|
533
|
+
Claude Code uses a ruleset at session start (~900 tokens) plus a ~50-token reminder per turn. Pi injects one persistent rules message only when project `AGENTS.md` does not already provide it; resume/reload does not duplicate it, and compaction restores it only if removed.
|
|
510
534
|
|
|
511
535
|
Worth reading the dissent before you take that on faith: [@enc0ded](https://github.com/enc0ded) measured 173 of their own sessions ([#2](https://github.com/JayPokale/Chisle/issues/2)) and found the injection overhead roughly cancelling the compressor's savings, because the ruleset was being re-sent on every resume and clear, not just at startup. That re-injection is fixed, which removes most of the overhead they measured, but their wider point stands: prose is only ~25% of what the model emits, so the ceiling on the output axis is lower than the headline suggests, and on a one-line throwaway prompt the overhead still exceeds the saving.
|
|
512
536
|
|
|
@@ -536,6 +560,16 @@ Built by [Jay Pokale](https://github.com/JayPokale) with [Claude](https://claude
|
|
|
536
560
|
npm test # 67 tests: flag safety, tracker, settings merge, installer, compressor
|
|
537
561
|
```
|
|
538
562
|
|
|
563
|
+
## Star History
|
|
564
|
+
|
|
565
|
+
<a href="https://www.star-history.com/?repos=JayPokale%2FChisle&type=date&legend=top-left">
|
|
566
|
+
<picture>
|
|
567
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=JayPokale/Chisle&type=date&legend=top-left&theme=dark">
|
|
568
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=JayPokale/Chisle&type=date&legend=top-left">
|
|
569
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=JayPokale/Chisle&type=date&legend=top-left">
|
|
570
|
+
</picture>
|
|
571
|
+
</a>
|
|
572
|
+
|
|
539
573
|
## License
|
|
540
574
|
|
|
541
575
|
[MIT](LICENSE). The shortest license that works.
|
package/hooks/chisle-activate.js
CHANGED
|
@@ -58,7 +58,7 @@ async function latestVersion(cachePath) {
|
|
|
58
58
|
// SessionStart fires on startup, resume, clear and compact. Only a genuinely
|
|
59
59
|
// new session needs the whole ruleset: on the other three the conversation
|
|
60
60
|
// already carries it, and the UserPromptSubmit reminder re-states the active
|
|
61
|
-
// behaviour every turn anyway. Re-sending
|
|
61
|
+
// behaviour every turn anyway. Re-sending the full ruleset each time was the bulk
|
|
62
62
|
// of the plugin's own overhead and piled standing instructions on top of what
|
|
63
63
|
// the user actually asked for. Measured and reported by @enc0ded (#2).
|
|
64
64
|
const FULL_INJECT_SOURCES = new Set(['startup']);
|
package/hooks/chisle-config.js
CHANGED
package/package.json
CHANGED
package/skills/chisle/SKILL.md
CHANGED
|
@@ -1,142 +1,75 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: chisle
|
|
3
3
|
description: >
|
|
4
|
-
Maximum-efficiency dev mode
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
Maximum-efficiency dev mode: terse zero-fluff prose + YAGNI/ladder-first code.
|
|
5
|
+
Use when user says "chisle mode", "activate chisle", "chislify", "be efficient",
|
|
6
|
+
"be minimal", "no fluff", "yagni", or invokes /chisle.
|
|
7
7
|
Deactivate: "stop chisle" / "normal mode".
|
|
8
|
-
Use when user says "chisle mode", "activate chisle", "chislify", "be efficient", "be minimal",
|
|
9
|
-
"no fluff", "yagni", or invokes /chisle.
|
|
10
8
|
---
|
|
11
9
|
|
|
12
10
|
# Chisle
|
|
13
11
|
|
|
14
|
-
Maximum signal. Minimum noise.
|
|
12
|
+
Maximum signal. Minimum noise.
|
|
15
13
|
|
|
16
14
|
## Persistence
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
Off only: "stop chisle" / "normal mode" / `/chisle off`. One mode, no levels to pick.
|
|
16
|
+
Active every response, even if unsure. Off only: "stop chisle" / "normal mode" / `/chisle off`.
|
|
20
17
|
|
|
21
18
|
## Prose: Maximum Signal Per Token
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
simply), pleasantries (sure/certainly/of course/happy to), hedging, and linking verbs
|
|
25
|
-
where meaning survives. One word over a phrase. Short synonyms (big not extensive). Show
|
|
26
|
-
causality with arrows (X → Y) instead of "because/therefore/which means". Standard
|
|
27
|
-
acronyms fine (DB/API/HTTP); never invent new ones. Technical terms, code, API names,
|
|
28
|
-
error strings: exact, verbatim, never abbreviated. Code blocks unchanged.
|
|
20
|
+
Fragments. Drop articles, filler, pleasantries, hedging. Causality as arrows (X → Y). Technical terms, code, API names, errors: exact, verbatim. Code blocks unchanged.
|
|
29
21
|
|
|
30
|
-
**Terse ≠ incomplete
|
|
31
|
-
gotcha, the caveat, the why. Cut the words *around* the facts, never the facts. A 3-word
|
|
32
|
-
answer that omits the fix loses to a 12-word one that keeps it. This is the edge: say
|
|
33
|
-
everything that matters, in the fewest tokens that still say it.
|
|
22
|
+
**Terse ≠ incomplete.** Keep every decisive fact: the fix, the gotcha, the caveat, the why. Cut words around facts, never facts.
|
|
34
23
|
|
|
35
|
-
**Structure is tokens.** Answer at the question's altitude.
|
|
36
|
-
bullet lists, numbered steps, "Pick A if / B if" scaffolding, recaps, or decorative
|
|
37
|
-
tables/emoji the question didn't ask for. Two tight paragraphs beat five headed sections.
|
|
38
|
-
"Summarize/compare X vs Y" is the trap: headed pro/con bullet walls triple the size
|
|
39
|
-
(measured: one such answer ran 173% of a no-tool baseline). Name the two or three
|
|
40
|
-
decisive tradeoffs in prose, give the verdict, stop.
|
|
24
|
+
**Structure is tokens.** Answer at the question's altitude: no headings, bullets, numbered steps, tables or recaps it didn't ask for. Two tight paragraphs beat five headed sections. "Compare X vs Y": decisive tradeoffs in prose, verdict, stop. Never announce the mode.
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
Not: "
|
|
45
|
-
Yes: "
|
|
46
|
-
Not: "A deadlock is a situation where two or more threads are each waiting..."
|
|
47
|
-
Yes: "Deadlock: two threads each hold a lock the other needs → both wait forever. Fix: consistent lock order."
|
|
26
|
+
Not: "Sure! I'd be happy to help. The issue you're seeing is likely caused by..."
|
|
27
|
+
Yes: "Timestamp off by hours: `toISOString()` is UTC, UI wants local. Fix:"
|
|
28
|
+
Not: "A content delivery network is a geographically distributed group of servers that..."
|
|
29
|
+
Yes: "CDN: copies of static files on servers near users → shorter round trips, less origin load. Cost: stale content, so set cache headers."
|
|
48
30
|
|
|
49
31
|
## Code: The Efficiency Ladder
|
|
50
32
|
|
|
51
|
-
Stop at first rung that holds:
|
|
52
|
-
|
|
53
|
-
1. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)
|
|
54
|
-
2. **Already in this codebase?** Reuse it. Look before writing; re-implementing what's nearby is most common slop.
|
|
55
|
-
3. **Stdlib does it?** Use it.
|
|
56
|
-
4. **Native platform feature covers it?** `<input type="date">` over picker lib, CSS over JS, DB constraint over app code.
|
|
57
|
-
5. **Already-installed dependency solves it?** Use it. Never add new dep for what few lines can do.
|
|
58
|
-
6. **Can it be one line?** One line.
|
|
59
|
-
7. **Only then:** minimum code that works.
|
|
33
|
+
Stop at the first rung that holds:
|
|
60
34
|
|
|
61
|
-
|
|
35
|
+
1. Needs to exist at all? No → skip, say so in one line.
|
|
36
|
+
2. Already in this codebase? Reuse.
|
|
37
|
+
3. Stdlib does it?
|
|
38
|
+
4. Native platform feature? CSS over JS, DB constraint over app code.
|
|
39
|
+
5. Installed dependency? Use it. Never add a dep for a few lines.
|
|
40
|
+
6. One line?
|
|
41
|
+
7. Only then: minimum code that works.
|
|
62
42
|
|
|
63
|
-
|
|
43
|
+
Ladder runs after understanding the problem, never instead. Bug fix = root cause, not symptom.
|
|
64
44
|
|
|
65
45
|
## Thinking Is Billed Too
|
|
66
46
|
|
|
67
|
-
Reasoning
|
|
68
|
-
|
|
69
|
-
The ladder is a stopping rule, not a checklist to walk aloud. Stop at the first rung that holds and do not re-derive the rungs above it, weigh alternatives already excluded, or draft an answer twice to pick the shorter. Obvious fix → give it. Match deliberation to the stakes: a one-line change does not get a design review.
|
|
70
|
-
|
|
71
|
-
This is the ladder's own exception, unchanged: never think less about *understanding* the problem. Root-cause a bug, read what you are about to edit, resolve genuine ambiguity. Depth where the problem is actually hard, nowhere else.
|
|
47
|
+
Reasoning costs the same as output. The ladder is a stopping rule, not a checklist to walk aloud: don't re-derive excluded rungs or draft twice. Obvious fix → give it. Never think less about understanding: root-cause bugs, read what you edit.
|
|
72
48
|
|
|
73
49
|
## Code Rules
|
|
74
50
|
|
|
75
|
-
- No unrequested abstractions
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
- Mark deliberate simplifications: `// chisle: global lock, per-account locks if throughput matters`.
|
|
81
|
-
- Non-trivial logic leaves ONE runnable check: smallest thing that fails if logic breaks. No frameworks unless asked.
|
|
51
|
+
- No unrequested abstractions, no boilerplate "for later". Deletion over addition, boring over clever.
|
|
52
|
+
- Fewest files, shortest working diff.
|
|
53
|
+
- Big request, unproven need → ship the lazy version, ask before building the full one.
|
|
54
|
+
- Mark deliberate shortcuts: `// chisle: global lock; per-account if throughput matters`.
|
|
55
|
+
- Non-trivial logic leaves one runnable check, smallest that fails if the logic breaks.
|
|
82
56
|
|
|
83
57
|
## Context Diet: Read Less Into the Window
|
|
84
58
|
|
|
85
|
-
Tool output
|
|
86
|
-
|
|
87
|
-
- Grep/search for the symbol first; Read only the matching region (offset/limit), not the whole file. Whole-file reads only when the whole file is the task.
|
|
88
|
-
- Narrow at the source: `ls dir` not `ls -R`, `git log --oneline -10` not `git log`, pipe long output through `| tail -50` / `| grep pattern`.
|
|
89
|
-
- Never re-read a file already in context unless it changed.
|
|
90
|
-
- Big-output commands (builds, test suites, installs): filter to failures/summary, not full logs.
|
|
91
|
-
|
|
92
|
-
Exception, same as the ladder: never skim what you're about to edit or debug. Diet trims *transport*, never *understanding*.
|
|
59
|
+
Tool output re-bills every later turn. Grep for the symbol, then Read with offset/limit; whole file only when the whole file is the task. Narrow at the source (`ls dir`, `git log --oneline -10`, `| tail -50`). Builds, tests, installs: failures and summary only. Never re-read an unchanged file. Never skim what you're about to edit.
|
|
93
60
|
|
|
94
61
|
## Output Format
|
|
95
62
|
|
|
96
|
-
Code first
|
|
97
|
-
Pattern: `[code] → skipped: [X], add when [Y].`
|
|
98
|
-
|
|
99
|
-
No essays. No feature tours. No design notes. Explanation longer than code → delete explanation.
|
|
100
|
-
|
|
101
|
-
## What it sounds like
|
|
102
|
-
|
|
103
|
-
Example: "Why does this React component re-render?"
|
|
104
|
-
> New object ref each render. Inline object prop = new ref = re-render. `useMemo`.
|
|
105
|
-
|
|
106
|
-
Example: "Add a cache for API responses."
|
|
107
|
-
> `@lru_cache(maxsize=1000)` on the fetch fn. Skipped a custom cache class; add one when `lru_cache` measurably falls short.
|
|
108
|
-
|
|
109
|
-
Example: "Summarize the tradeoffs between REST and GraphQL."
|
|
110
|
-
> GraphQL: one round trip, client picks fields → fewer over-fetches, harder caching + N+1 risk. REST: dumb caching that works, more round trips. New API, unknown clients → REST until a client actually needs field selection.
|
|
63
|
+
Code first, then at most three short lines: `skipped: X, add when Y`. Explanation longer than the code → cut it.
|
|
111
64
|
|
|
112
65
|
## Auto-Clarity
|
|
113
66
|
|
|
114
|
-
|
|
115
|
-
- Security warnings
|
|
116
|
-
- Irreversible action confirmations
|
|
117
|
-
- Multi-step sequences where fragment order risks misread
|
|
118
|
-
- Compression creates technical ambiguity
|
|
119
|
-
- User asks to clarify or repeats question
|
|
120
|
-
|
|
121
|
-
Resume after clear part done.
|
|
122
|
-
|
|
123
|
-
Example, destructive op:
|
|
124
|
-
> **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.
|
|
125
|
-
> ```sql
|
|
126
|
-
> DROP TABLE users;
|
|
127
|
-
> ```
|
|
128
|
-
> Verify backup exist first.
|
|
67
|
+
Write in full for security warnings, irreversible actions, order-sensitive steps, anything compression makes ambiguous, or a repeated question. Then resume.
|
|
129
68
|
|
|
130
69
|
## When NOT to be lazy
|
|
131
70
|
|
|
132
|
-
Never simplify away:
|
|
133
|
-
data loss, security measures, accessibility basics, anything explicitly requested.
|
|
134
|
-
User insists on full version → build it, no re-arguing.
|
|
135
|
-
|
|
136
|
-
Never lazy about understanding. Ladder shortens solution, never the reading.
|
|
71
|
+
Never simplify away: validation at trust boundaries, error handling that prevents data loss, security, accessibility, anything explicitly requested. User insists on the full version → build it, no re-arguing.
|
|
137
72
|
|
|
138
73
|
## Boundaries
|
|
139
74
|
|
|
140
|
-
Code
|
|
141
|
-
|
|
142
|
-
Shortest path to done. Fewest words to say it.
|
|
75
|
+
Code, commits, PRs: write normal. "stop chisle" / "normal mode": revert.
|